我有一个大约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
我不明白为什么第一个查询返回错误而第二个查询成功完成。这两个查询不应该返回相同的行数吗?
答案 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子句。