BigQuery 从现有表插入分区表

Posted

技术标签:

【中文标题】BigQuery 从现有表插入分区表【英文标题】:BigQuery insert into a partitioned table from an existing table 【发布时间】:2016-06-10 16:15:33 【问题描述】:

我必须使用相同架构 tab1tab1_partitioned 的表,其中后者按天分区。

我正在尝试使用以下命令将数据插入分区表:

bq query --allow_large_results --replace --noflatten_results --destination_table 'advertiser.development_partitioned$20160101' 'select * from advertiser.development where ymd = 20160101';

但我收到以下错误:

BigQuery error in query operation: Error processing job 'total-handler-133811:bqjob_r78379ac2513cb515_000001553afb7196_1': Provided Schema does not match Table 

两者具有完全相同的架构,我真的不明白为什么会收到该错误。有人能解释一下我的问题吗?

事实上,如果 BigQuery 支持 Hive 中支持的动态分区插入,我更愿意,但有些天的搜索似乎表明这是不可能的:-/

【问题讨论】:

【参考方案1】:

您看到的行为是由于我们在将写入处置与表分区一起使用时如何处理它们。

您应该能够使用 WRITE_APPEND 配置附加到分区以使查询通过。

bq query --allow_large_results --append_table --noflatten_results --destination_table 'advertiser.development_partitioned$20160101' 'select * from advertiser.development where ymd = 20160101';

使其与 --replace 一起使用存在一些复杂性,但我们目前正在研究改进对表分区的架构支持。

如果这对您不起作用,请告诉我。谢谢!

回答您关于动态分区的问题的另一部分 - 我们确实计划支持更丰富的分区风格,我们相信它们将处理大多数用例。

【讨论】:

关于动态分区的一个额外点:将现有数据插入分区 bigquery 表的最佳方法是什么?我们在 Hadoop 中的现有表包含大量数据并且已经分区 如果您在现有的 bigquery 日期分片表中有数据,您可以使用 bq cp 命令将其复制到分区表中。如果您在 bigquery 之外有数据,则可以使用写入表分区(例如:table$20160615)作为目标的加载作业将其加载到 BigQuery 表中。这将确保数据最终出现在您选择的分区中。 cloud.google.com/bigquery/docs/… 这就是我正在做的 atm。我认为有一个更简单的选择。谢谢。【参考方案2】:

仅供参考,我认为并非总是如此,但现在有一种方法可以使用 bigquery UI 中的 DML 将数据从非分区表复制到 bigquery 中的分区表。例如,如果您的原始表中有一个日期字符串,格式为 YYYY-MM-DD,您可以运行它来将数据移动到分区表中...

create table my_dataset.my_table (sesh STRING, prod STRING) partition by DATE(_PARTITIONTIME);

insert into my_dataset.my_table (_PARTITIONTIME, sesh, prod) select CAST(PARSE_DATE('%Y-%m-%d',  mydatestr) as TIMESTAMP), sesh, prod from my_dataset.my_orig_table;

【讨论】:

以上是关于BigQuery 从现有表插入分区表的主要内容,如果未能解决你的问题,请参考以下文章

将超过 7 天的数据插入分区 BigQuery 表

使用模板表的 BigQuery 流式插入 - 503 错误

如何在 BigQuery UI 中插入覆盖分区表?

bigquery 自动更新表

如何删除现有表的默认分区到期?

BigQuery - 使用分区创建视图,但基表没有