Google Bigquery:复制日期分区表所需的分区规范

Posted

技术标签:

【中文标题】Google Bigquery:复制日期分区表所需的分区规范【英文标题】:Google Bigquery: Partitioning specification needed for copying date partitioned table 【发布时间】:2017-06-16 10:06:59 【问题描述】:

注意:这几乎与this question 重复,区别在于在这种情况下,源表是日期分区的,而目标表还不存在。此外,该问题的公认解决方案在这种情况下不起作用。

我正在尝试将一天的数据从一个日期分区表复制到一个我尚未创建的新日期分区表中。我希望 BigQuery 会像通常为非日期分区的情况一样为我创建日期分区的目标表。

使用 BigQuery CLI,这是我的命令:

bq cp mydataset.sourcetable\$20161231 mydataset.desttable\$20161231

这是该命令的输出:

cp 操作中的 BigQuery 错误:错误处理作业 'myproject:bqjob_bqjobid':必须提供分区规范 为了创建分区表

我尝试过使用 python SDK 做类似的事情:在日期分区表上运行一个选择命令(它只从一个日期分区中选择数据)并将结果保存到一个新的目标表中(我希望这也是日期分区)。作业失败并出现同样的错误:

u'message': u'必须提供分区规范才能 创建分区表', u'reason': u'invalid'

显然我需要添加一个分区规范,但我找不到任何有关如何添加的文档。

【问题讨论】:

【参考方案1】:

您需要先创建分区目标表(as per the docs):

如果你想将一个分区表复制到另一个分区表中 表,源和目标的分区规范 表必须匹配。

因此,只需在开始复制之前创建目标分区表。如果您不介意指定架构,您可以像这样创建目标分区表:

bq mk --time_partitioning_type=DAY mydataset.temps

然后,使用查询而不是副本来写入目标表。架构将与它一起复制:

bq query --allow_large_results --replace --destination_table 'mydataset.temps$20160101''SELECT * from `source`'

【讨论】:

太糟糕了,没有选项可以告诉 bigquery 将日期分区添加到目标表。但我不必指定架构真是太好了——那是痛苦的部分。 只是想知道。假设我想清空列的值,同时将其从源复制到目标(其余列的值保持不变),我该如何实现? 只是想补充一下,以防其他人在 2021 年遇到此问题,如果您运行“bq mk”命令,然后运行原始“bq cp”,现在似乎可以正常工作,而无需编写复制为查询。

以上是关于Google Bigquery:复制日期分区表所需的分区规范的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery - 将通配符表查询与日期分区表一起使用?

为啥 Google BigQuery 在使用视图时没有正确使用分区日期

如何在Google Bigquery中创建按日期(每年)分区的表格

BigQuery 日期分区视图

复制记录以填补 Google BigQuery 中日期之间的空白

复制记录组以填补 Google BigQuery 中的多个日期空白