3

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

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

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

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

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

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

4

1 回答 1

4

导致此响应的不是结果大小,而是您的 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 子句是在确定整个结果集之后应用的。

于 2012-06-13T22:01:17.053 回答