継続的クエリでストリーム間結合を使用する
BigQuery では、継続的クエリでストリーム間結合を使用して、2 つ以上のリアルタイム データ ストリームのデータを分析して関連付けることができます。ストリーム間結合は、時間指向のデータの取り込みを行う 2 つ以上のテーブル間の結合オペレーションです。
ストリーム間結合の一般的なユースケースには、金融詐欺の検出、顧客プロファイルの構築、サプライ チェーン管理の最適化などがあります。これらの結合は、ステートフル オペレーションの主要なタイプです。ステートフル オペレーションの詳細については、サポートされているステートフル オペレーションをご覧ください。
サポートされている JOIN タイプ
継続的クエリでは、次の JOIN タイプがサポートされています。
- ストリーム間の JOIN - 時間指向のデータの取り込みを行う 2 つ以上のテーブル間の結合オペレーション。
- INNER JOIN。
サポートされていない JOIN タイプ
継続的クエリでは、次の JOIN タイプはサポートされていません。
- ストリームから静的テーブルへの JOIN - 結合されたテーブルの少なくとも 1 つが、時間指向のデータの取り込みを受け取らない静的テーブルである結合。静的テーブルの例としては、ディメンション テーブルがあります。
INNER以外の JOIN オペレーションの形式。- 時間指向の JOIN 句がない JOIN。
複数のストリームのデータを結合する
次のクエリは、タクシー乗車テーブルをタクシー リクエスト テーブルに結合し、5 分間の時間枠内でリクエスト元に最も近い利用可能なタクシーを特定して、このデータを別の BigQuery テーブルにエクスポートする方法を示しています。
INSERT INTO
`real_time_taxi_streaming.matched_rides`
SELECT
requests.timestamp AS request_time,
requests.request_id,
taxis.taxi_id,
ST_DISTANCE(
ST_GEOGPOINT(requests.longitude, requests.latitude),
ST_GEOGPOINT(taxis.longitude, taxis.latitude)
) AS distance_in_meters,
taxis.timestamp AS taxi_available_time
FROM
APPENDS (TABLE `real_time_taxi_streaming.ride_requests`,
CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) AS requests
INNER JOIN
APPENDS (TABLE `real_time_taxi_streaming.taxirides`,
CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) AS taxis
ON
requests.geohash = taxis.geohash
WHERE
taxis.ride_status = 'available'
AND taxis._CHANGE_TIMESTAMP BETWEEN(requests._CHANGE_TIMESTAMP - INTERVAL 5 MINUTE) AND requests._CHANGE_TIMESTAMP
AND ST_DWITHIN(
ST_GEOGPOINT(requests.longitude, requests.latitude),
ST_GEOGPOINT(taxis.longitude, taxis.latitude),
2000 -- Distance in meters
);
結合に関する考慮事項
以降のセクションでは、ストリーム間の結合を行う際に考慮すべき事項について説明します。
制限事項
INNER JOINオペレーションのみがサポートされています。LEFTやFULL OUTERなどの他の形式は対象外です。INNER JOINオペレーションの両側で、継続的クエリの開始時刻を指定する必要があります。- 結合キー(
table1.user_id = table2.user_idなど)に加えて、JOIN句には、タイムスタンプ列を一定の間隔に制限する条件を含める必要があります。この条件は、システムが一致するイベントが他のストリームに到着するのを待つ時間を制限します。たとえば、タイムスタンプが 5 分以内のイベントのみを結合するように指定できます。対称的な間隔に限定されません。たとえば、結合条件の一方で 5 分間隔を使用し、もう一方で 1 時間間隔を使用できます。 - ストリーム間結合で継続的クエリを開始する場合は、
APPENDS関数のみがサポートされます。CHANGES関数はサポートされていません。 _CHANGE_TIMESTAMPで定義される BigQuery システム時刻列は、結合オペレーションでサポートされている唯一のタイムスタンプ列です。ユーザー定義の列はサポートされていません。- ウィンドウ集計と組み合わせて使用する場合は、ドキュメントに記載されているウィンドウ集計の制限事項をすべて遵守する必要があります。
料金に関する考慮事項
BigQuery 継続的クエリは、ジョブの実行中に使用されたコンピューティング容量(スロット)に基づいて課金されます。このコンピューティング ベースのモデルは、結合などのステートフル オペレーションにも適用されます。結合では、クエリがアクティブな間、システムが「状態」を保存する必要があるため、追加のスロット リソースが消費されます。結合内に保存されるコンテキストまたはデータが多いほど(たとえば、JOIN 句または WHERE 句で長い時間間隔を使用する場合)、より多くの状態を保持する必要があるため、スロット使用率が高くなります。
次のステップ
- BigQuery の継続的クエリの詳細を確認する。
- ウィンドウ集計の使用方法を確認する。
- JOIN、集計、ウィンドウ処理を行う方法を学習する。