2

BigQuery では、以下を実行しようとしています。

SELECT day, AVG(value)/(1024*1024) FROM ( 
    SELECT value, UTC_USEC_TO_DAY(timestamp) as day, 
         PERCENTILE_RANK() OVER (PARTITION BY day ORDER BY value ASC) as rank 
    FROM [Datastore.PerformanceDatum]
    WHERE type = "MemoryPerf"
) WHERE rank >= 0.9 AND rank <= 0.91 
GROUP BY day 
ORDER BY day desc;

これは比較的少量のデータを返します。しかし、次のメッセージが表示されます。

Error: Resources exceeded during query execution. The query contained a GROUP BY operator, consider using GROUP EACH BY instead. For more details, please see https://developers.google.com/bigquery/docs/query-reference#groupby

このクエリが失敗する原因、サブクエリのサイズは何ですか? 問題を回避するために実行できる同等のクエリはありますか?


コメントに応じて編集: GROUP EACH BY を追加 (および外側の ORDER BY を削除) すると、クエリは失敗し、GROUP EACH BY はここでは並列化できないと主張します。

4

1 に答える 1

1

私は私のために働く同等のクエリを書きました:

SELECT day, AVG(value)/(1024*1024) FROM (
SELECT data value, UTC_USEC_TO_DAY(dtimestamp) as day, 
         PERCENTILE_RANK() OVER (PARTITION BY day ORDER BY value ASC) as rank 
    FROM [io_sensor_data.moscone_io13]
    WHERE sensortype = "humidity"
) WHERE rank >= 0.9 AND rank <= 0.91 
GROUP BY day 
ORDER BY day desc;

内部クエリのみを実行すると、3,660,624 件の結果が得られます。あなたのデータセットはそれよりも大きいですか?

外側の選択では、日ごとにグループ化すると 4 つの結果しか得られません。別のグループ化を試して、そこで制限に達することができるかどうかを確認します。

SELECT day, AVG(value)/(1024*1024) FROM (
SELECT data value, dtimestamp / 1000 as day, 
         PERCENTILE_RANK() OVER (PARTITION BY day ORDER BY value ASC) as rank 
    FROM [io_sensor_data.moscone_io13]
    WHERE sensortype = "humidity"
) WHERE rank >= 0.9 AND rank <= 0.91 
GROUP BY day 
ORDER BY day desc;

現在、57,862 の異なるグループで実行されます。

同じエラーに到達するために、さまざまな組み合わせを試しました。初期データの量を 2 倍にしたのと同じエラーが発生しました。データ量を 2 倍にする簡単な「ハック」が変更されています。

    FROM [io_sensor_data.moscone_io13]

に:

    FROM [io_sensor_data.moscone_io13], [io_sensor_data.moscone_io13]

その後、同じエラーが発生します。どのくらいのデータを持っていますか? 追加のフィルターを適用できますか? 既に percentile_rank を日ごとに分割しているため、追加のクエリを追加して、一部の日数のみ (たとえば、先月のみ) を分析できますか?

于 2013-06-28T03:41:07.680 に答える