Memahami agregasi jendela dalam kueri berkelanjutan

Untuk meminta dukungan atau memberikan masukan terkait fitur ini, kirim email ke bq-continuous-queries-feedback@google.com.

Kueri berkelanjutan BigQuery mendukung agregasi dan windowing sebagai operasi stateful. Operasi stateful memungkinkan kueri berkelanjutan melakukan analisis kompleks yang memerlukan penyimpanan informasi di beberapa baris atau interval waktu. Kemampuan ini memungkinkan Anda menghitung metrik dari waktu ke waktu—seperti rata-rata 30 menit—dengan menyimpan data yang diperlukan dalam memori saat kueri berjalan.

Fungsi windowing menetapkan data ke dalam komponen logis, atau jendela, berdasarkan waktu sistem, yang menunjukkan waktu penerapan transaksi yang membuat perubahan. Di BigQuery, fungsi ini adalah fungsi bernilai tabel (TVF) yang menampilkan tabel yang mencakup semua kolom asli dan dua kolom tambahan: window_start dan window_end. Kolom ini mengidentifikasi interval waktu untuk setiap periode. Untuk mengetahui informasi selengkapnya tentang operasi stateful, lihat Operasi stateful yang didukung.

TVF jendela hanya didukung dengan kueri berkelanjutan BigQuery.

TVF windowing berbeda dengan panggilan fungsi jendela.

Fungsi agregasi yang didukung

Fungsi agregasi berikut didukung:

Fungsi agregasi yang tidak didukung

Fungsi agregasi berikut tidak didukung:

Fungsi TUMBLE

Fungsi TUMBLE menetapkan data ke dalam interval waktu yang tidak tumpang-tindih (tumbling window) dengan ukuran yang ditentukan. Misalnya, periode 5 menit mengelompokkan acara ke dalam interval terpisah seperti [2026-01-01 12:00:00, 2026-01-01 12:05:00) dan [2026-01-01 12:05:00, 2026-01-01 12:10:00). Baris dengan nilai stempel waktu 2026-01-01 12:03:18 ditetapkan ke periode pertama. Karena periode ini tidak berurutan dan tidak tumpang-tindih, setiap elemen dengan stempel waktu ditetapkan ke tepat satu periode.

Diagram berikut menunjukkan cara fungsi TUMBLE menetapkan peristiwa ke dalam interval waktu yang tidak tumpang-tindih:

Fungsi TUMBLE menetapkan peristiwa ke dalam interval waktu yang tidak tumpang-tindih.

Anda dapat menggunakan fungsi ini dalam pemrosesan peristiwa real-time untuk mengelompokkan peristiwa menurut rentang waktu sebelum melakukan agregasi.

Sintaksis

TUMBLE(TABLE table, "timestamp_column", window_size)

Definisi

  • table: Nama tabel BigQuery. Ini harus berupa tabel BigQuery standar yang dienkapsulasi dalam fungsi APPENDS. Kata TABLE harus mendahului argumen ini.

  • timestamp_column: Literal STRING yang menentukan nama kolom dalam tabel input yang berisi waktu acara. Nilai dalam kolom ini menetapkan setiap baris ke jendela. Kolom _CHANGE_TIMESTAMP, yang menentukan waktu sistem BigQuery, adalah satu-satunya timestamp_column yang didukung. Kolom yang ditentukan pengguna tidak didukung.

  • window_size: Nilai INTERVAL yang menentukan durasi setiap jendela bergulir. Ukuran jendela dapat mencapai maksimum 24 jam. Misalnya: INTERVAL 30 SECOND.

Output

Fungsi TUMBLE menampilkan output dengan kolom berikut:

  • Semua kolom tabel input pada saat kueri berjalan.

  • window_start: Nilai TIMESTAMP yang menunjukkan waktu mulai inklusif periode yang menjadi bagian dari data.

  • window_end: Nilai TIMESTAMP yang menunjukkan waktu berakhir eksklusif periode tempat data berada.

Materialisasi output

Dalam kueri berkelanjutan BigQuery, agregasi berwindow tidak menghasilkan output untuk interval waktu tertentu hingga BigQuery menyelesaikan atau menutup window tersebut. Perilaku ini memastikan bahwa BigQuery hanya mengeluarkan hasil gabungan setelah memproses semua data yang relevan untuk periode tersebut.

Misalnya, jika Anda melakukan agregasi jendela TUMBLE 5 menit pada tabel user_clickstream, hasil untuk interval [10:15; 10:20) hanya dikeluarkan setelah kueri memproses rekaman dengan _CHANGE_TIMESTAMP 10:20 atau lebih baru. Pada saat itu, BigQuery menganggap jendela sudah ditutup. Selain itu, jendela terbuka dan mulai mengumpulkan data saat rekaman pertama yang termasuk dalam rentang waktu tertentu tersebut muncul.

Selama jendela tetap terbuka, BigQuery harus mempertahankan hasil agregasi perantara. Hal ini memerlukan penyimpanan status, yang berarti BigQuery harus mempertahankan hasil agregasi menengah. Karena status ini harus tetap berada dalam memori aktif hingga jendela ditutup, penggunaan durasi jendela yang lebih lama atau pemrosesan aliran bervolume tinggi menyebabkan pemanfaatan slot yang lebih tinggi untuk mengelola peningkatan jumlah konteks yang disimpan. Untuk mengetahui informasi selengkapnya, lihat Pertimbangan harga.

Batasan

  • Fungsi TUMBLE hanya didukung dalam kueri berkelanjutan BigQuery.
  • Saat memulai kueri berkelanjutan dengan fungsi TUMBLE, Anda hanya dapat menggunakan fungsi APPENDS. Fungsi CHANGES tidak didukung.
  • Kolom waktu sistem BigQuery yang ditentukan oleh _CHANGE_TIMESTAMP adalah satu-satunya timestamp_column yang didukung. Kolom yang ditentukan pengguna tidak didukung.
  • Ukuran jendela dapat mencapai maksimum 24 jam.
  • Saat fungsi windowing TUMBLE berjalan, fungsi ini akan menghasilkan dua kolom output tambahan: window_start dan window_end. Anda harus menyertakan setidaknya satu kolom ini dalam pernyataan GROUP BY dalam pernyataan SELECT yang melakukan agregasi jendela.
  • Saat menggunakan fungsi TUMBLE dengan gabungan kueri berkelanjutan, Anda harus mengikuti semua batasan gabungan kueri berkelanjutan.

Pertimbangan harga

Kueri berkelanjutan BigQuery menagih Anda berdasarkan kapasitas komputasi (slot) yang digunakan saat tugas berjalan. Model berbasis komputasi ini juga berlaku untuk operasi stateful seperti windowing. Karena memerlukan BigQuery untuk menyimpan "status" saat kueri aktif, pemberian jendela menggunakan resource slot tambahan. Secara umum, semakin banyak konteks atau data yang disimpan dalam jendela—seperti saat menggunakan durasi jendela yang lebih panjang—semakin banyak status yang harus dipertahankan BigQuery. Hal ini menghasilkan pemanfaatan slot yang lebih tinggi.

Contoh

Kueri berikut menunjukkan cara mengkueri tabel perjalanan taksi untuk mendapatkan jumlah perjalanan rata-rata streaming, jumlah penumpang, dan tarif rata-rata per taksi setiap 30 menit, serta mengekspor data ini ke dalam tabel di 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

Langkah berikutnya