使用COUNT时,BigQuery错误“响应太大而无法返回”(DISTINCT ...)

时间:2012-06-13 19:47:26

标签: google-bigquery

我有一个大约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

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

1 个答案:

答案 0 :(得分: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子句。