将多个 BigQuery 表导出为一个

Posted

技术标签:

【中文标题】将多个 BigQuery 表导出为一个【英文标题】:Exporting Many BigQuery Tables to One 【发布时间】:2017-07-25 18:06:25 【问题描述】:

我们正在启动从多个表中提取数据并写入单个表的 bigquery 查询。我们正在使用 Python 运行带有参数的作业:

job = bq_client.run_async_query(jobname, select_query)
job.destination = bq_table
job.write_disposition = 'WRITE_APPEND'

500 个工作开始时有 20 个。不幸的是,我们会定期遇到错误:

超出速率限制:此表的表更新操作过多。 有关详细信息,请参阅 https://cloud.google.com/bigquery/troubleshooting-errors

问题:

这是因为 bigquery 作业/查询对单个目标表的写入过多吗?如果是这样,我很惊讶 Google 没有在内部限制 bigquery 作业的写入吞吐量。 如果是这种情况,我们很难衡量有多少作业可以并行执行,因为每个选择查询的数据负载存在很大差异。可以做些什么来避免或处理这些错误?退避并重试?

编辑

查询针对的是 Google Analytics 360 数据。例如:

SELECT
  ...
FROM [datasetname.ga_sessions_date];

每个数据集可以是不同的数据集,并且可以跨多个日期进行查询。

我无法针对列共享计算,但也许这足以想出一种方法来整合这些查询。

【问题讨论】:

cloud.google.com/bigquery/quota-policy 想知道:如果所有查询都附加到同一个表中,您能否将所有查询合并到一个表中? @MikhailBerlyant 不幸的是,在这种情况下,我们无法控制写入速率,因为我们正在处理向 Google 发送的 SELECT 查询 @FelipeHoffa 我的知识在这里有限 - 每个选择都来自单独的数据集和表。有没有可能合并这些? @KevinDeenauth 如果您发布了您的查询示例,我们可以尝试编写一个合并的示例 【参考方案1】:

假设 SELECT List 对于所有查询都是相同的

对于 BigQuery 标准 SQL

#standardSQL
SELECT ... FROM `datasetname1.ga_sessions_date` UNION ALL   
SELECT ... FROM `datasetname2.ga_sessions_date` UNION ALL
...   
SELECT ... FROM `datasetnameN.ga_sessions_date`   

对于 BigQuery 旧版 SQL

#legacySQL
SELECT ... FROM
  (SELECT ... FROM [datasetname1.ga_sessions_date]),  
  (SELECT ... FROM [datasetname2.ga_sessions_date]),  
  ...   
  (SELECT ... FROM [datasetnameN.ga_sessions_date])  

【讨论】:

我们会试一试,因为我们的局限性更容易预测。但是,我相信我们会遇到 256KB 的最大查询长度。我们的较长查询之一是 3.5KB,这导致最多 75 个联合查询。 您只需要重新组合您的查询。不一定你真的需要将所有查询合并为一个 - 你可以“批量”它们 - 所以你可以有 10 个左右而不是 500 个:o) 你有机会尝试吗? 只是想知道我的用例是否会陷入上述麻烦。我的用例是,我正在尝试同时为 分区表 执行 WRITE_TRUNCATE,比方说,在一秒钟内对分区表执行五个 WRITE_TRUNCATE 操作,但是不同的分区。 这意味着在一秒钟内,我正在尝试为一个表的五个不同分区执行五个 WRITE_TRUNCATE 操作。我的用例会导致得到Exceeded rate limits: too many table update operations for this table rateLimitExceeded - table.write 吗? AFAIK,分区表在内部维护为单独的表(对于每个分区)。所以我的假设是,我的更新操作发生在不同的表(不同的分区)中,所以我不会遇到像too many table update operations for this table 这样的问题,对吗?

以上是关于将多个 BigQuery 表导出为一个的主要内容,如果未能解决你的问题,请参考以下文章

将多个 BigQuery 表导出为一个

如何让我的客户将 BigQuery 查询结果导出为 CSV

Bigquery 导出拆分为多个文件,其中包含一些空文件

BigQuery - 在插入表时调用查询

将 BigQuery 结果与 FCM 结合使用

在 BigQuery 中恢复过期的 Firebase 表并将数据保存时间超过 60 天