如何在 GBQ 中创建日期分区表?你会用蟒蛇吗?

goo*_*ose 3 python google-bigquery

我有不到 100M 的数据记录,我希望通过对字段进行非规范化然后输入到日期分区的 GBQ 表中来转换这些数据记录。日期可以追溯到2001年。

我曾希望我可以用 Python 转换它,然后直接从脚本中使用 GBQ 来实现这一点,但是在阅读了这篇文章,特别是这篇文档之后,创建日期分区表似乎并不简单。我正在寻找正确的方向。

有没有可以做到这一点的python脚本的工作示例?或者不可能通过Python来做?或者有没有其他人可以指出我的方向?

更新

我不确定我是否遗漏了什么,但是创建的表似乎按照我创建表时的插入日期进行了分区,并且我想按现有数据集中设置的日期进行分区。无论如何我都看不到改变这一点。

这是我正在尝试的内容:

import uuid
import os
import csv

from google.cloud import bigquery
from google.cloud.bigquery import SchemaField
from google.cloud.bigquery import Client
from google.cloud.bigquery import Table
import logging #logging.warning(data_store+file)
import json
import pprint

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path to service account credentials'

client = bigquery.Client()

dataset = client.dataset('test_dataset')
dataset.create()

SCHEMA = [
    SchemaField('full_name', 'STRING', mode='required'),
    SchemaField('age', 'INTEGER', mode='required'),
]
table = dataset.table('table_name', SCHEMA)
table.partitioning_type = "DAY"
table.create()

rows = [
    ('bob', 30),
    ('bill', 31)
]

table.insert_data(rows)
Run Code Online (Sandbox Code Playgroud)

在我创建表和插入数据时,是否可以修改它以控制分区?

更新 2

事实证明,我不是在寻找表分区,对于我的用例,只需将日期序列附加到表名的末尾,然后使用以下内容进行查询就足够了:

SELECT * FROM `dataset.test_dataset.table_name_*`
WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170702'
Run Code Online (Sandbox Code Playgroud)

我不知道这在技术上是否仍然是分区,但据我所知,它具有相同的好处。

Yar*_*arh 6

更新到最新版本 ( google-cloud-biquery==1.4.0)

from google.cloud import bigquery

client = bigquery.Client()
dataset_ref = client.dataset('test_dataset')
table_ref = dataset_ref.table('test_table')
SCHEMA = [
    SchemaField('full_name', 'STRING', mode='required'),
    SchemaField('age', 'INTEGER', mode='required'),
]
table = bigquery.Table(table_ref, schema=SCHEMA)

if partition not in ('DAY', ):
    raise NotImplementedError(f"BigQuery partition type unknown: {partition}")
table.time_partitioning = bigquery.table.TimePartitioning(type_=partition)
table = client.create_table(table)  # API request
Run Code Online (Sandbox Code Playgroud)