【问题标题】:BigQuery: Running query against large datasetBigQuery:对大型数据集运行查询
【发布时间】:2018-07-24 03:17:46
【问题描述】:

我有大约 100TB 的数据需要通过对转换字段运行查询来回填,然后将转换写入另一个表。此表按摄取时间时间戳进行分区。正如您在下面看到的,我将这两个操作都作为单个查询的一部分。我计划通过摄取时间戳范围手动以较小的块多次运行此查询。

有没有比手动分块运行查询更好的方法来处理这个过程?例如,可能使用 Dataflow 或其他框架。

CREATE TABLE IF NOT EXISTS dataset.table
PARTITION BY DATE(timestamp) AS
with load as (SELECT *, _TABLE_SUFFIX as tableId
    FROM `project.dataset.table_*`
    WHERE _TABLE_SUFFIX BETWEEN '1' AND '1531835999999'
    ),................
     ...................

【问题讨论】:

    标签: google-cloud-platform google-bigquery


    【解决方案1】:

    您需要准确地执行您运行的查询,因为报价执行非常有限。

    分区表

    • 每个分区表的最大分区数 - 4,000

    • 单个作业修改的最大分区数 - 2,000

    • 每个作业操作(查询或加载)最多可影响 2,000 个分区。任何影响超过 2000 个分区的查询或加载作业都会被 Google BigQuery 拒绝。

    • 每个表每天的最大分区修改数 - 5,000 对于分区表,您每天最多可以进行 5,000 次分区修改。可以使用追加或覆盖分区中的数据的操作来修改分区。修改分区的操作包括:加载作业、将结果写入分区的查询或修改分区中数据的 DML 语句(INSERT、DELETE、UPDATE 或 MERGE)。

    • 一个作业可能会影响多个分区。例如,DML 语句可以更新多个分区中的数据(对于摄取时间表和分区表)。查询作业和加载作业也可以写入多个分区,但仅限于分区表。在确定作业消耗多少配额时,Google BigQuery 使用受作业影响的分区数。流式插入不会影响此配额。

    • 最大分区操作率 - 每 10 秒 50 次分区操作

    大多数时候您会遇到第二个限制,单个作业不超过 2000 个,如果您进一步并行化,您会遇到最后一个限制,每 10 秒执行 50 个分区操作。

    另一方面,DML MERGE 语法可能会为您提供帮助。

    如果您有销售代表与 BQ 团队联系,如果他们可以增加您的一些配额,他们会做出积极的回应。

    我还看到人们使用多个项目来运行超过配额的工作。

    【讨论】:

    • 我知道超时限制。我的问题更多是关于如何做到这一点而不是我正在做的事情。
    • 什么超时限制?你能说得更具体点吗?
    • 我的意思是分区的配额限制。我的问题更多关于回填插入多个分区的大型数据集的最佳做法是什么。目前我不得不多次手动运行查询。如果能够并行化和自动化此操作,那就太好了。
    • 您需要使用您最喜欢的编程语言之一来构建这些自动化和脚本,并使用 cron 作业或消息队列来安排您过去所做的任何事情,以运行异步调度/节流东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多