APPROX_COUNT_DISTINCT işlevi, bir sütundaki farklı değerlerin yaklaşık sayısını döndürür. Doğruluğun küçük ve yapılandırılabilir bir bölümünden fedakarlık ederek toplam düğümündeki durum ek yükünü önemli ölçüde azaltır. Bu nedenle, kesin sayımın gerekli olmadığı benzersiz ziyaretçi (UV) sayımı gibi yüksek kardinaliteli kullanım durumları için son derece uygundur.
Sürüm gereksinimi: Ververica Runtime (VVR) 3.0.0 veya üzeri.
Ne zaman kullanılır?
Aşağıdaki iki koşulun da sağlandığı durumlarda COUNT DISTINCT yerine APPROX_COUNT_DISTINCT kullanın:
Sütun çok sayıda farklı anahtar içeriyorsa (örneğin kullanıcı kimlikleri, oturum belirteçleri, URL'ler). Düşük kardinaliteli sütunlar için bu işlev anlamlı bir performans avantajı sağlamaz.
Giriş akışı geri çekme (retract) mesajları içermiyorsa.
Bu koşullardan herhangi biri karşılanmıyorsa bunun yerine COUNT DISTINCT kullanın.
Nasıl çalışır?
COUNT DISTINCT kesin bir sonuç üretmek için her farklı anahtarı durum verilerinde saklamak zorundadır. Yüksek kardinaliteli sütunlarda bu durum önemli okuma/yazma ek yüküne neden olur ve bir performans darboğazı haline gelir.
APPROX_COUNT_DISTINCT her anahtarı saklamadan farklı sayımı tahmin eder. Bu yaklaşım durum darboğazını ortadan kaldırır ve toplam düğümünde miniBatch ile yerel-genel optimizasyonların kullanılmasına olanak tanır.
accuracy parametresi hesaplama doğruluğunu kontrol eder. Daha büyük bir değer daha yüksek doğruluk anlamına gelir; bu da durum ek yükünü artırır ve COUNT DISTINCT üzerindeki performans avantajını zayıflatır.
Söz dizimi
APPROX_COUNT_DISTINCT(col [, accuracy])
Parametreler
| Parametre | Tür | Zorunlu | Açıklama |
|---|---|---|---|
col |
Tüm veri türleri | Evet | Farklı değerlerinin sayılacağı sütun. |
accuracy |
FLOAT | Hayır | Hesaplama doğruluğu. Geçerli değerler: (0.0, 1.0). Varsayılan: 0.99. Daha yüksek bir değer, daha yüksek durum ek yükü pahasına daha yüksek doğruluk sağlar; bu da COUNT DISTINCT üzerindeki performans avantajını azaltır. |
Örnek
Aşağıdaki örnek, varsayılan doğruluk (0.99) ve daha düşük bir doğruluk (0.9) düzeyindeki sonuçları karşılaştırır.
Giriş tablosu 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 |
Sorgu
SELECT
a,
APPROX_COUNT_DISTINCT(b) AS b,
APPROX_COUNT_DISTINCT(b, 0.9) AS c
FROM T1
GROUP BY a;
Sonuçlar
| a (VARCHAR) | b (BIGINT) | c (BIGINT) |
|---|---|---|
| Hi | 6 | 6 |
| Hello | 4 | 4 |
b sütunu 0.99 varsayılan doğruluğunu kullanır; c sütunu ise 0.9 değerini kullanır.