如何将分区表复制到 BigQuery 中的另一个分区表
Posted
技术标签:
【中文标题】如何将分区表复制到 BigQuery 中的另一个分区表【英文标题】:How to copy a partitioned table to another partitioned table in BigQuery 【发布时间】:2017-04-28 01:55:16 【问题描述】:我正在尝试将一个分区表复制到另一个分区表中。根据docs,这应该是可以的。
如果要将一个分区表复制到另一个分区表中,源表和目标表的分区规范必须匹配。
为了测试,我创建了两个具有相同架构的分区表(partition1
和partition2
)。我将 3 条记录推送到 partition1
表上的分区 $20170101
:
echo '"a":1, "b":2' | bq insert '<removed>.partition1$20170101'
echo '"a":1, "b":2' | bq insert '<removed>.partition1$20170101'
echo '"a":1, "b":2' | bq insert '<removed>.partition1$20170101'
看起来不错:
接下来,我将 2 条记录推送到 partition2
表和同一个分区 ($20170101
):
echo '"a":1, "b":2' | bq insert '<removed>.partition2$20170101'
echo '"a":1, "b":2' | bq insert '<removed>.partition2$20170101'
再一次,这看起来不错:
现在,我想将附加 partition2
复制到 partition1
。我希望在$20170101
分区下的partition1
中看到5 条记录:
bq cp --append_table <removed>.partition2 <removed>.partition1
Waiting on bqjob_r6d160e17a3b7b733_0000015bb238aa54_1 ... (0s) Current status: DONE
Tables '<removed>.partition2' successfully copied to '<removed>.partition1'
但是,partition1
中仍然只有 3 条记录。
我做错了什么?
【问题讨论】:
我无法确认这种行为!我只是做了你描述的所有完全相同的步骤(但在 UI 中)并得到了预期的结果 - 5 条记录。您能否仔细检查您是否按照您的描述进行操作? 你是如何在 UI 中复制的?如果表已经存在,则不允许这样做。它必须通过 API 完成... 好点。我没有使用 Google Web UI。我们使用的 UI 都是通过 API 调用实现的——所以从技术上讲,它是通过 API 实现的。但我认为,你提出的问题应该不重要。除非是 bq 命令行工具的问题 我使用了 CLI 工具 -bq cp --append_table <removed>.partition2 <removed>.partition1
- 它肯定不起作用。我检查了三次。
是的,我明白了。我在上一条评论中提到这可能是 bq cli 的问题
【参考方案1】:
这是我安装的gcloud
工具版本中的一个错误。我更新了它,然后它按预期工作了。
运行:
gcloud components update
【讨论】:
【参考方案2】:我已经从 gcloud 尝试过类似这样的命令,它可以工作 -->
bq cp -a '<source_project>:<source_dataset>.<source_table>$20180605' <destination_project>:<destination_dataset>.<destination_table>
而且它工作得非常好.... 注意:- 在上面的命令中,不需要提及目标分区值/信息。它会自动从源分区数据/值中获取。
【讨论】:
以上是关于如何将分区表复制到 BigQuery 中的另一个分区表的主要内容,如果未能解决你的问题,请参考以下文章
如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是不是不是必需的?
如果一个数组包含使用 BigQuery 的另一个数组的所有值,我如何过滤行?
Google Bigquery:复制日期分区表所需的分区规范