我有一个摄入时间分区表,它变得有点大了。我希望按其中一列中的值进行分组,并使用该值将其拆分为多个表。在保留新的摄入时间分区表中的原始_PARTITIONTIME值的同时,是否有一种简单的方法来做到这一点?
同时,我也希望能得到一些相对简单/便宜的东西。我可以多次复制我的表,然后删除每个副本上除了一个值之外的所有数据,但是对于所有这些删除操作,我都会收取巨额费用。
而且,在我想要分割的列中有足够的唯一值,将"WHERE列= value“的查询结果保存到表中,因为每个值的代价都很高。我没有找到任何提到这种方法是否会保留分区的文档,所以即使它的成本不高,它也可能不起作用。
发布于 2018-04-27 20:58:43
您所描述的需要有两个级别的分区的情况,目前还不支持。
您可以创建列分区表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)
发布于 2018-09-17 23:43:16
BigQuery现在支持https://cloud.google.com/bigquery/docs/clustered-tables分区表,它允许您指定数据应该被分割的其他列。
https://stackoverflow.com/questions/50053516
复制相似问题