Google Big Query拆分摄取时间分区表

问题描述 投票:0回答:2

我有一个摄取时间分区表,有点大。我想按其中一列中的值进行分组,并使用它将其拆分为多个表。是否有一种简单的方法可以在新的摄取时间分区表中保留原始的_PARTITIONTIME值?

此外,我希望有一些相对简单/便宜的东西。我可以做一些像复制我的表一样的东西然后删除每个副本上除了一个值之外的所有数据的数据,但是我会为所有这些DELETE操作收取大笔费用。

此外,我想要拆分的列中有足够的唯一值,将“WHERE column = value”查询结果保存到表中,每个值都会成本过高。我没有找到任何文档提到这种方法是否会保留分区,所以即使它不是成本过高,它也可能无效。

google-cloud-platform google-bigquery
2个回答
1
投票

您描述的情况需要具有尚未支持的两级分区

您可以创建列分区表https://cloud.google.com/bigquery/docs/creating-column-partitions并在此之后根据需要构建此列的值,用于在插入之前进行分区 - 但在这种情况下,您丢失了_PARTITIONTIME值

基于另外的澄清 - 我有类似的问题 - 我的解决方案是编写将读取源表的python应用程序(读取在这里很重要 - 不是查询 - 因此它将是免费的) - 根据您的标准和流数据拆分数据(简单 - 但不是免费的)或生成json / csv文件并将其上传到目标表(也将是免费的,但对这些操作的数量有一些限制) - 如果你走第二条路线,将需要更多的编码/异常处理。

您也可以通过DataFlow来实现 - 它肯定比定制解决方案更昂贵,但可能更强大。

gcloud python库的示例

client = bigquery.Client(project="PROJECT_NAME")

t1 = client.get_table(source_table_ref)
target_schema = t1.schema[1:] #removing first column which is a key to split
ds_target = client.dataset(project=target_project, dataset_id=target_dataset)

rows_to_process_iter = client.list_rows( t1, start_index=start_index, max_results=max_results)
# convert to list
rows_to_process = list(rows_to_process_iter)
# doing something with records

# stream records to destination 
errors = client.create_rows(target_table, records_to_stream)

0
投票

BigQuery现在支持clustered分区表,允许您指定数据应拆分的其他列。

© www.soinside.com 2019 - 2024. All rights reserved.