Menggunakan gabungan stream-ke-stream dalam kueri berkelanjutan

Di BigQuery, Anda dapat menggunakan gabungan stream-to-stream dalam kueri berkelanjutan untuk menganalisis dan menghubungkan data dari dua atau beberapa aliran data real-time. Gabungan stream-ke-stream adalah operasi gabungan antara dua tabel atau lebih yang menerima penyerapan data berorientasi waktu.

Kasus penggunaan umum untuk penggabungan stream-to-stream mencakup deteksi penipuan keuangan, membangun profil pelanggan, dan mengoptimalkan pengelolaan supply chain. Gabungan ini adalah jenis utama operasi stateful. Untuk mengetahui informasi selengkapnya tentang operasi stateful, lihat Operasi stateful yang didukung.

Jenis JOIN yang didukung

Jenis JOIN berikut didukung oleh kueri berkelanjutan:

  • JOIN stream-ke-stream—operasi join antara dua tabel atau lebih yang menerima penyerapan data berorientasi waktu.
  • INNER JOIN.

Jenis JOIN yang tidak didukung

Jenis JOIN berikut tidak didukung oleh kueri berkelanjutan:

  • JOIN stream-ke-tabel-statis—gabungan yang setidaknya satu tabel yang digabungkan adalah tabel statis yang tidak menerima penyerapan data berorientasi waktu. Contoh tabel statis adalah tabel dimensi.
  • Bentuk operasi JOIN lainnya selain INNER.
  • JOIN yang tidak memiliki klausa JOIN berorientasi waktu.

Menggabungkan data dari beberapa aliran data

Kueri berikut menunjukkan cara menggabungkan tabel perjalanan taksi ke tabel permintaan taksi dan mengidentifikasi taksi terdekat yang tersedia untuk pemohon dalam jangka waktu 5 menit, serta mengekspor data ini ke tabel BigQuery lain:

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
   );

Pertimbangan penggabungan

Bagian berikut menjelaskan pertimbangan yang diperlukan saat melakukan gabungan stream-ke-stream.

Batasan

  • Hanya operasi INNER JOIN yang didukung; bentuk lain, seperti LEFT atau FULL OUTER, tidak didukung.
  • Setiap sisi operasi INNER JOIN harus menentukan waktu mulai untuk kueri berkelanjutan.
  • Selain kunci gabungan (misalnya, table1.user_id = table2.user_id), klausa JOIN harus menyertakan kondisi untuk membatasi kolom stempel waktu ke interval konstan. Kondisi ini membatasi berapa lama sistem menunggu peristiwa yang cocok tiba di aliran data lain. Misalnya, Anda dapat menentukan bahwa peristiwa dari satu aliran data hanya dapat digabungkan dengan peristiwa dari aliran data lain jika stempel waktunya berada dalam interval 5 menit. Anda tidak terbatas pada interval simetris. Misalnya, Anda dapat menggunakan interval 5 menit di satu sisi kondisi join dan interval 1 jam di sisi lainnya.
  • Saat memulai kueri berkelanjutan dengan gabungan stream-ke-stream, hanya fungsi APPENDS yang didukung. Fungsi CHANGES tidak didukung.
  • Kolom waktu sistem BigQuery, yang ditentukan oleh _CHANGE_TIMESTAMP, adalah satu-satunya kolom stempel waktu yang didukung untuk operasi join. Kolom yang ditentukan pengguna tidak didukung.
  • Jika digunakan bersama dengan agregasi berjendela, Anda harus mengikuti semua batasan agregasi jendela yang terdokumentasi.

Pertimbangan harga

Kueri berkelanjutan BigQuery ditagih berdasarkan kapasitas komputasi (slot) yang digunakan saat tugas berjalan. Model berbasis komputasi ini juga berlaku untuk operasi stateful seperti join. Karena gabungan mengharuskan sistem menyimpan "status" saat kueri aktif, gabungan menggunakan resource slot tambahan. Lebih banyak konteks atau data yang disimpan dalam join—misalnya, saat Anda menggunakan interval waktu yang lebih lama dalam klausa JOIN atau WHERE—memerlukan lebih banyak status, yang menyebabkan pemanfaatan slot yang lebih tinggi.

Langkah berikutnya