将多个 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 表导出为一个的主要内容,如果未能解决你的问题,请参考以下文章