1

次のフィールドを持つ BigQuery のテーブルがあります。

time,a,b,c,d

timeは ISO8601 形式の文字列ですが、スペースを含みますa。 は 1 ~ 16000 の整数で、その他の列は文字列です。テーブルには 1 か月分のデータが含まれており、1 日あたり数百万のレコードがあります。

次のクエリは、「応答が大きすぎます」で失敗します。

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,b,c,d,count(a),count(distinct a, 1000000)
from [myproject.mytable]
group by day,b,c,d
order by day,b,c,d asc

ただし、このクエリは機能します (データは 2012 年 1 月 1 日から始まります)。

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,
  b,c,d,count(a),count(distinct a)
from [myproject.mytable]
where UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) = UTC_USEC_TO_DAY(PARSE_UTC_USEC('2012-01-01 00:00:00'))
group by day,b,c,d
order by day,b,c,d asc

これは、この問題に関連しているようです。ただし、group by句があるため、一番上のクエリは 2 番目のクエリを繰り返し呼び出すことと同じです。クエリプランナーはこれを処理できませんか?

編集:私のテストデータを明確にするには:

私が生成した偽のテストデータを使用しています。私はもともといくつかのフィールドを使用し、1 か月の時間ごとの要約を取得しようとしました ( 、時間はクエリの一部で使用してgroup by hour定義されます)。それが失敗したとき、私は毎日に切り替えてみました。それが失敗したとき、関連する列を減らしました。を使用した場合も失敗しましたが、1日分を実行しただけでは機能しました。(パラメーターを削除しても機能しますが、それ1 日クエリで機能するため、クエリ プランナーが期待どおりに物事を分離していないようです。)asselectcount (distinct xxx, 1000000)1000000

チェックされたもののcount (distinct)カーディナリティは 16,000 で、group by 列のカーディナリティは 2 と 20 で、合計で 1200 行が予想されます。列の値は非常に短く、約 10 文字です。

4

1 に答える 1

1

どのくらいの結果を期待していますか? 現在、許可される結果の合計サイズには約 64MB の制限があります。結果として数百万行が予想される場合、これは予想されるエラーである可能性があります。

結果の数が極端に多くない場合、サイズの問題は最終的な応答ではなく、内部計算にある可能性があります。具体的には、GROUP BY からの結果が多すぎると、クエリがメモリ不足になる可能性があります。考えられる解決策の 1 つは、"GROUP BY" を "GOUP EACH BY" に変更することです。これにより、クエリの実行方法が変わります。これは現在実験的な機能であり、そのため、まだ文書化されていません。

クエリでは、select で指定されたフィールドを group by で参照するため、次のようにする必要がある場合があります。

select day, b,c,d,day,count(a),count(distinct a, 1000000) 
FROM (
    select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day, b, c, d
    from [myproject.mytable]
)
group EACH by day,b,c,d
order by day,b,c,d asc
于 2012-12-19T16:49:45.087 に答える