Pengecualian hive count: WHERE klausa menyebabkan kiraan meningkat
Semasa penerokaan data Hive, fenomena aneh telah diperhatikan. Apabila mengira menggunakan pernyataan ringkas select count(*) as c from mytable
, hasilnya ialah 1,129,563. Walau bagaimanapun, penambahan penapis select count(*) as c from mytable where master_id is not null
secara tidak dijangka meningkatkan kiraan kepada 1,134,041.
Siasatan lanjut mendedahkan bahawa lajur master_id
sentiasa mengandungi nilai bukan nol. Ini membawa kepada soalan: Bagaimana untuk menerangkan bahawa pelaksanaan syarat pengecualian nilai nol sebenarnya meningkatkan bilangan baris?
Penjelasan yang mungkin: Statistik sarang
Jawapannya terletak pada memahami kesan statistik Hive. Secara lalai, Hive menggunakan statistik untuk mengoptimumkan pertanyaan dan meningkatkan prestasi. Apabila melaksanakan pertanyaan select count(*) as c from mytable
(tanpa sebarang penapisan), Hive mungkin bergantung pada statistik yang disimpan untuk menganggarkan kiraan. Walau bagaimanapun, statistik ini tidak selalunya tepat atau terkini.
Dalam kes ini, statistik mungkin menunjukkan bahawa terdapat banyak baris dalam lajur master_id
yang mengandungi nilai nol. Apabila menambahkan penapis master_id is not null
, Hive menilai semula statistik dan mengiktiraf bahawa kebanyakan baris mengandungi nilai bukan nol. Ini menghasilkan kiraan yang lebih tepat, menghapuskan percanggahan yang ketara.
Kaedah untuk menyelesaikan masalah
Untuk mendapatkan kiraan yang tepat, terutamanya apabila bekerja dengan jadual yang telah diubah dengan ketara atau belum dianalisis baru-baru ini, adalah disyorkan:
hive.compute.query.using.stats=false
untuk menghalang Hive daripada menggunakan statistik dan memaksa imbasan jadual penuh. ANALYZE TABLE
untuk mengemas kini statistik jadual secara manual dan memastikan ketepatannya. hive.stats.autogather=true
untuk mengumpul statistik secara automatik semasa operasi data seperti INSERT OVERWRITE
. Atas ialah kandungan terperinci Mengapa Menambah Klausa `WHERE master_id IS NOT NULL` Meningkatkan `COUNT(*)` dalam Hive?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!