我有一个摄取时间分区表,它有点大。我想按其中一列中的值进行分组,并使用它将其拆分为多个表。是否有一种简单的方法可以在新的摄取时间分区表中保留原始的_PARTITIONTIME值?
我也希望能找到相对简单/便宜的东西。我可以做一些像复制我的表一样的东西然后删除每个副本上除了一个值之外的所有数据的数据,但是我会为所有这些DELETE操作收取大笔费用。
此外,我想要拆分的列中有足够的唯一值,以保存" WHERE列=值"对每个值的表查询结果将是成本过高的。我没有找到任何文档提到这种方法是否会保留分区,因此即使它不是成本过高,也可能无效。
答案 0 :(得分: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)
答案 1 :(得分:0)
BigQuery现在支持 clustered 分区表,该表允许您指定数据应被分割的其他列。