継続的クエリのウィンドウ集計について
この機能に関するサポートのリクエストやフィードバックは、bq-continuous-queries-feedback@google.com 宛てにメールでお送りください。
BigQuery の継続的クエリは、ステートフル オペレーションとして集計とウィンドウ処理をサポートしています。ステートフル オペレーションを使用すると、継続的クエリで複数の行または時間間隔にわたって情報を保持する必要がある複雑な分析を実行できます。この機能を使用すると、クエリの実行中に必要なデータをメモリに保存することで、30 分間の平均値などの指標を時間経過とともに計算できます。
ウィンドウ関数は、変更を行ったトランザクションの commit 時刻を示すシステム時刻に基づいて、データを論理コンポーネント(ウィンドウ)に割り当てます。BigQuery では、これらの関数は、元のすべての列と window_start と window_end の 2 つの追加列を含むテーブルを返すテーブル値関数(TVF)です。これらの列は、各ウィンドウの時間間隔を識別します。ステートフル オペレーションの詳細については、サポートされているステートフル オペレーションをご覧ください。
ウィンドウ TVF は、BigQuery 継続的クエリでのみサポートされています。
ウィンドウ TVF は、ウィンドウ関数呼び出しとは異なります。
サポートされている集計関数
次の集計関数がサポートされています。
ANY_VALUEAPPROX_COUNT_DISTINCTAPPROX_QUANTILESAPPROX_TOP_COUNTAPPROX_TOP_SUM- 次の要件を満たす
ARRAY_AGGLIMIT句は必須で、最大値は 100 です。ORDER BY句は省略可能です。
ARRAY_CONCAT_AGGAVGBIT_ANDBIT_ORBIT_XORCORRCOUNTCOUNTIFCOVAR_POPCOVAR_SAMPLOGICAL_ANDLOGICAL_ORMAXMAX_BYMINMIN_BYSTDDEVSTDDEV_POPSTDDEV_SAMP- 次の要件を満たす
STRING_AGGLIMIT句は必須で、最大値は 100 です。ORDER BY句は省略可能です。
SUMVAR_POPVAR_SAMPVARIANCE
サポートされていない集計関数
次の集計関数はサポートされていません。
AVG(差分プライバシー)COUNT(差分プライバシー)DISTINCT式を含む関数。GROUPINGPERCENTILE_CONT(差分プライバシー)ST_CENTROID_AGGST_EXTENTST_UNION_AGGSUM(差分プライバシー)
TUMBLE 関数
TUMBLE 関数は、指定されたサイズの重複しない時間間隔(タンブリング ウィンドウ)にデータを割り当てます。たとえば、5 分間の時間枠では、イベントが [2026-01-01 12:00:00, 2026-01-01 12:05:00) や [2026-01-01 12:05:00, 2026-01-01 12:10:00) などの個別の間隔にグループ化されます。タイムスタンプ値 2026-01-01 12:03:18 を持つ行は、最初のウィンドウに割り当てられます。これらのウィンドウは互いに素であり、重複しないため、タイムスタンプ付きのすべての要素は 1 つのウィンドウに割り当てられます。
次の図は、TUMBLE 関数がイベントを重複しない時間間隔に割り当てる方法を示しています。
この関数は、リアルタイム イベント処理で使用して、集計を実行する前にイベントを時間範囲でグループ化できます。
構文
TUMBLE(TABLE table, "timestamp_column", window_size)
定義
table: BigQuery テーブル名。これは、APPENDS関数でラップされた標準の BigQuery テーブルである必要があります。この引数の前にTABLEという単語を付ける必要があります。timestamp_column: イベント時間を含む入力テーブルの列の名前を指定するSTRINGリテラル。この列の値は、各行をウィンドウに割り当てます。BigQuery システム時間を定義する_CHANGE_TIMESTAMP列のみがサポートされているtimestamp_columnです。ユーザー定義の列はサポートされていません。window_size: 各タンブリング ウィンドウの期間を定義するINTERVAL値。ウィンドウ サイズは最大 24 時間です。例:INTERVAL 30 SECOND。
出力
TUMBLE 関数は、次の列を含む出力を返します。
クエリ実行時の入力テーブルのすべての列。
window_start: レコードが属するウィンドウの包括的な開始時刻を示すTIMESTAMP値。window_end: レコードが属するウィンドウの終了時刻(排他的)を示すTIMESTAMP値。
出力の実体化
BigQuery 継続的クエリでは、BigQuery がウィンドウを確定または閉じるまで、ウィンドウ集計は特定の時間間隔の出力を生成しません。この動作により、BigQuery はそのウィンドウの関連データをすべて処理した後にのみ集計結果を出力します。
たとえば、user_clickstream テーブルで 5 分間の TUMBLE ウィンドウ集計を実行する場合、[10:15; 10:20) の結果は、クエリが 10:20 以降の _CHANGE_TIMESTAMP を持つレコードを処理した後にのみ出力されます。その時点で、BigQuery はウィンドウが閉じられたと見なします。また、その特定の期間に属する最初のレコードが表示された瞬間にウィンドウが開き、データの蓄積が開始されます。
ウィンドウが開いている間、BigQuery は中間集計結果を保持する必要があります。これには状態の保存が必要になるため、BigQuery は中間集計結果を保持する必要があります。この状態はウィンドウが閉じるまでアクティブ メモリに残しておく必要があるため、ウィンドウの期間を長くしたり、大容量のストリームを処理したりすると、保存されるコンテキストの量が増加し、スロット使用率が高くなります。詳細については、料金に関する考慮事項をご覧ください。
制限事項
TUMBLE関数は、BigQuery 継続的クエリでのみサポートされています。TUMBLE関数で継続的クエリを開始する場合は、APPENDS関数のみを使用できます。CHANGES関数はサポートされていません。_CHANGE_TIMESTAMPで定義された BigQuery システム時刻列のみがサポートされているtimestamp_columnです。ユーザー定義の列はサポートされていません。- ウィンドウ サイズは最大 24 時間です。
TUMBLEウィンドウ関数が実行されると、window_startとwindow_endの 2 つの追加出力列が生成されます。ウィンドウ集計を実行するSELECTステートメント内のGROUP BYステートメントに、これらの列の少なくとも 1 つを含める必要があります。- 継続的クエリ結合で
TUMBLE関数を使用する場合は、継続的クエリ結合のすべての制限事項に従う必要があります。
料金に関する考慮事項
BigQuery 継続的クエリでは、ジョブの実行中に消費されたコンピューティング容量(スロット)に基づいて課金されます。このコンピューティング ベースのモデルは、ウィンドウ処理などのステートフル オペレーションにも適用されます。ウィンドウ処理では、クエリがアクティブな間に BigQuery が「状態」を保存する必要があるため、追加のスロット リソースが消費されます。一般に、ウィンドウ内に保存されるコンテキストまたはデータが多いほど(ウィンドウ期間が長い場合など)、BigQuery が保持する必要がある状態が多くなります。これにより、スロットの使用率が向上します。
例
次のクエリは、タクシー乗車テーブルをクエリして、30 分ごとにタクシーの平均乗車数、乗客数、平均運賃を取得し、このデータを BigQuery のテーブルにエクスポートする方法を示しています。
INSERT INTO
`real_time_taxi_streaming.driver_stats`
WITH ride_completions AS (
SELECT
_CHANGE_TIMESTAMP as bq_changed_ts,
CAST(timestamp AS DATE) AS ride_date,
taxi_id,
meter_reading,
passenger_count
FROM
APPENDS(TABLE `real_time_taxi_streaming.taxirides`,
CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE)
WHERE
ride_status = 'dropoff')
SELECT
ride_date,
window_end,
taxi_id,
COUNT(taxi_id) AS total_rides_per_half_hour,
ROUND(AVG(meter_reading),2) AS avg_fare_per_half_hour,
SUM(passenger_count) AS total_passengers_per_half_hour
FROM
tumble(TABLE ride_completions,"bq_changed_ts",INTERVAL 30 MINUTE)
GROUP BY
window_end,
ride_date,
taxi_id
次のステップ
- JOIN、集計、ウィンドウ処理を行う方法を学習する。
- BigQuery の継続的クエリの詳細を確認する。
- 複数のストリームのデータを結合する方法を確認する。