【问题标题】:How to create hourly an daily rollup table in BigQuery without running into "Response too large to return" error?如何在 BigQuery 中每小时创建一个每日汇总表而不会遇到“响应太大而无法返回”错误?
【发布时间】:2013-06-12 10:06:08
【问题描述】:

在传统数据建模中,我创建每小时和每日汇总表以减少数据存储并提高查询响应时间。但是,尝试创建类似的汇总表很容易遇到“响应太大而无法返回”错误。使用 BigQuery 创建汇总表的推荐方法是什么?我需要减少数据以降低存储和查询的成本。

谢谢!

【问题讨论】:

标签: google-bigquery


【解决方案1】:

最近宣布的 BigQuery 功能可提供大量结果!

现在您可以指定一个标志和一个目标表。任意大小的结果将存储在指定的表中。

https://developers.google.com/bigquery/docs/queries#largequeryresults

【讨论】:

    【解决方案2】:

    听起来您正在将所有数据附加到单个表中,然后想要创建较小的表来查询......对吗?

    一种选择是将数据加载到每小时切片中,然后通过使用 write_disposition=WRITE_APPEND 执行表复制操作来创建每日表和“所有”表。或者,您可以在查询中使用多个表。例如select foo from table20130101,table20130102,table20130102。 (注意这不做连接,它做一个 UNION ALL。这是 bigquery 查询语法的一个怪癖)。

    如果很难更改表的布局,则目前不支持更大的查询结果大小,但这是我们最需要的功能之一,我们将其列为高优先级。

    此外,创建较小的表不一定会提高查​​询性能,因为 bigquery 会尽可能并行处理查询。它不会降低存储成本,除非您只存储表的一部分。当然,它会降低查询的成本,因为对更大的表运行查询会更昂贵。

    如果你能多描述一下你的场景,我或许可以提供更具体的建议。

    【讨论】:

    • 最初将 1 分钟粒度的数据插入到每小时表中。预计每秒插入到初始每小时表的约 1,500,000 条记录。然后每小时汇总将时间粒度从 1 分钟减少到 10 分钟。每日表,将时间段从 10 分钟更改为 1 小时粒度。每个汇总基本上将所有 4 个整数测量值相加并按 5 个维度分组。我没有很多列,但在维度上我确实有很多独特的价值。
    • jobs.insert 查询配置有一个新的实验标志——“allowLargeResults”。这需要您为查询设置目标表,但允许任何大小的响应。这仍然是一个实验性命令。目前,使用它的唯一方法是直接调用api。不过,bq.py 命令行工具很快就会提供支持。
    • 您的另一个选择当然是将汇总查询分解为多个查询并将结果附加在一起。您可以使用 SELECT foo, sum(bar) FROM table WHERE ABS(HASH(foo)) % 10 == <index> 之类的东西来做到这一点,其中 是第 n 个查询。
    • 非常感谢 allowLargeResult 的建议!我会试试这个。现在,我最终查询了 10 分钟的数据,并将 10 分钟的汇总块附加到每小时汇总表中。
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2011-07-09
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多