*`COUNT()` Hive's Menghasilkan Keputusan Yang Tidak Dijangka Selepas Penapisan**
Menggunakan fungsi COUNT(*)
Hive kadangkala boleh menghasilkan hasil yang mengejutkan. Pertimbangkan jadual, "mytable," dengan lajur "master_id."
Pertanyaan kiraan awal mendedahkan 1,129,563 baris:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable;</code>
Walau bagaimanapun, penapisan untuk nilai "master_id" bukan nol secara tidak dijangka meningkatkan kiraan kepada 1,134,041:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;</code>
Ini membingungkan, terutamanya kerana pertanyaan yang menyemak nilai "master_id" nol mengembalikan sifar:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NULL;</code>
Punca Disebalik Percanggahan
Ketidakkonsistenan ini berpunca daripada pergantungan Hive pada statistik jadual untuk pengoptimuman pertanyaan. Pertanyaan COUNT(*)
awal, tanpa klausa WHERE
, mungkin menggunakan anggaran statistik dan bukannya imbasan jadual penuh. Menambah klausa WHERE
memaksa imbasan jadual lengkap, membawa kepada kiraan baris yang tepat dan lebih tinggi.
Cara Mendapatkan Kiraan Tepat
Untuk menjamin hasil yang tepat, pertimbangkan penyelesaian berikut:
Lumpuhkan Pengoptimuman Berasaskan Statistik: Halang Hive daripada menggunakan statistik untuk pengoptimuman pertanyaan:
<code class="language-sql">SET hive.compute.query.using.stats=false;</code>
Kemas Kini Statistik Jadual Secara Manual: Gunakan perintah ANALYZE TABLE
untuk memuat semula statistik jadual:
<code class="language-sql">ANALYZE TABLE mytable COMPUTE STATISTICS;</code>
Dayakan Pengumpulan Statistik Automatik: Konfigurasikan Hive untuk mengemas kini statistik secara automatik semasa operasi INSERT OVERWRITE
:
<code class="language-sql">SET hive.stats.autogather=true;</code>
Dengan melaksanakan salah satu kaedah ini, anda boleh memastikan COUNT(*)
pertanyaan anda secara konsisten mengembalikan kiraan baris yang tepat.
Atas ialah kandungan terperinci Mengapa `COUNT(*)` Hive Saya Meningkat Selepas Penapisan untuk Nilai Bukan Nol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!