3

〜 20M 行のデータセットがあり、次の動作を観察しています。

以下のクエリは、「応答が大きすぎて返すことができません」というエラーを返します。「id」フィールドは複数のレコード間で共有され、「フィールド」フィールドには各レコードの任意の値があります。結果セットには、クエリ応答の制限をはるかに下回る 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

最初のクエリがエラーを返し、2 番目のクエリが正常に完了する理由がわかりません。両方のクエリが同じ数の行を返すべきではありませんか?

4

1 に答える 1

4

この応答を引き起こしているのは結果サイズではなく、COUNTDISTINCTクエリによって生成されたデータの中間サイズです。

注: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 に答える