APPROX_COUNT_DISTINCT mengembalikan perkiraan jumlah nilai unik dalam suatu kolom. Fungsi ini menukar sebagian kecil akurasi—yang dapat dikonfigurasi—dengan beban state yang jauh lebih rendah pada node agregat, sehingga sangat cocok untuk kasus penggunaan ber-kardinalitas tinggi seperti penghitungan pengunjung unik (UV) yang tidak memerlukan hasil eksak.
Persyaratan versi: Ververica Runtime (VVR) 3.0.0 atau yang lebih baru.
Kapan menggunakannya
Gunakan APPROX_COUNT_DISTINCT alih-alih COUNT DISTINCT jika kedua kondisi berikut terpenuhi:
Kolom tersebut memiliki jumlah kunci unik yang besar (misalnya, user ID, session token, URL). Fungsi ini tidak memberikan manfaat performa yang signifikan untuk kolom dengan kardinalitas rendah.
Aliran input tidak berisi pesan retract.
Jika salah satu kondisi tidak terpenuhi, gunakan COUNT DISTINCT sebagai gantinya.
Cara kerja
COUNT DISTINCT harus menyimpan setiap kunci unik dalam data state untuk menghasilkan nilai eksak. Pada kolom dengan kardinalitas tinggi, hal ini menyebabkan beban baca/tulis yang signifikan dan menjadi bottleneck performa.
APPROX_COUNT_DISTINCT memperkirakan jumlah nilai unik tanpa menyimpan setiap kunci. Pendekatan ini menghilangkan bottleneck state dan memungkinkan penerapan optimisasi miniBatch serta local-global pada node agregat.
Parameter accuracy mengatur tingkat akurasi komputasi. Nilai yang lebih besar menunjukkan akurasi yang lebih tinggi, tetapi menyebabkan beban state yang lebih tinggi dan melemahkan keunggulan performa dibandingkan COUNT DISTINCT.
Sintaksis
APPROX_COUNT_DISTINCT(col [, accuracy])Parameter
| Parameter | Type | Wajib | Deskripsi |
|---|---|---|---|
col | Semua tipe data | Ya | Kolom tempat menghitung jumlah nilai unik. |
accuracy | FLOAT | Tidak | Akurasi komputasi. Nilai valid: (0.0, 1.0). Nilai default: 0.99. Nilai yang lebih tinggi menunjukkan akurasi yang lebih tinggi dengan biaya beban state yang lebih besar, sehingga mengurangi keunggulan performa dibandingkan COUNT DISTINCT. |
Contoh
Contoh berikut membandingkan hasil pada akurasi default (0.99) dan akurasi yang lebih rendah (0.9).
Tabel input T1
| a (VARCHAR) | b (BIGINT) |
|---|---|
| Hi | 1 |
| Hi | 2 |
| Hi | 3 |
| Hi | 4 |
| Hi | 5 |
| Hi | 6 |
| Hello | 1 |
| Hello | 2 |
| Hello | 3 |
| Hello | 4 |
Kueri
SELECT
a,
APPROX_COUNT_DISTINCT(b) AS b,
APPROX_COUNT_DISTINCT(b, 0.9) AS c
FROM T1
GROUP BY a;Hasil
| a (VARCHAR) | b (BIGINT) | c (BIGINT) |
|---|---|---|
| Hi | 6 | 6 |
| Hello | 4 | 4 |
Kolom b menggunakan akurasi default 0.99; kolom c menggunakan 0.9.