【问题标题】:BigQuery error "Response too large to return" when using COUNT(DISTINCT ...)使用 COUNT(DISTINCT ...) 时出现 BigQuery 错误“响应太大而无法返回”
【发布时间】:2012-06-16 20:18:33
【问题描述】:

我有一个大约 20M 行的数据集,我正在观察以下行为。

以下查询返回错误“响应太大而无法返回”。 'id' 字段在多个记录之间共享,并且'field' 字段对每条记录都有一些任意值。我希望结果集应该只包含 10 行,远低于查询响应限制。

SELECT id, COUNT(DISTINCT field)
FROM [my.dataset]
GROUP BY id
LIMIT 10

但是,当 DISTINCT 关键字从 COUNT 聚合函数中移除时,BigQuery 会按预期返回 10 个结果。

SELECT id, COUNT(field)
FROM [my.dataset]
GROUP BY id
LIMIT 10

我不明白为什么第一个查询返回错误而第二个查询成功完成。两个查询不应该返回相同数量的行吗?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    导致此响应的不是结果大小,而是您的 COUNT DISTINCT 查询生成的数据的中间大小。

    注意:COUNT DISTINCT 在 1000 个值之后返回统计近似值 - 您可以通过选择特定值作为 DISTINCT 将返回近似值的限制来更改近似值。例如:COUNT(DISTINCT your_field, 500)

    见:https://developers.google.com/bigquery/docs/query-reference#aggfunctions

    这种行为是由于 BigQuery 的设计造成的,这使得它变得如此之快:通过单独的节点查询数据,并在混合器中汇总结果。 COUNT 将计算结果的总数并组合答案,但 COUNT DISTINCT 需要跟踪潜在的数百万个单独的总和,然后再组合这些值。因此 COUNT DISTINCT 可以创建大量数据,并且可能超过单个节点的内部最大值。

    另请注意,目前,BigQuery LIMIT 子句是在确定整个结果集之后应用的。

    【讨论】:

    • 那是一个相当混乱的错误信息。文档中是否有任何地方记录了此类限制?
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多