ハイブ カウント例外: WHERE 句によりカウントが増加します
Hive データの探索中に、奇妙な現象が観察されました。単純なステートメント select count(*) as c from mytable
を使用してカウントすると、結果は 1,129,563 になります。ただし、フィルター select count(*) as c from mytable where master_id is not null
を追加すると、カウントが予期せず 1,134,041 に増加しました。
さらなる調査により、master_id
列には常に null 以外の値が含まれていることが判明しました。ここで、NULL 値除外条件の実装によって実際に行数が増加することをどのように説明すればよいでしょうか?という疑問が生じます。
考えられる説明: Hive 統計
答えは、Hive 統計の影響を理解することにあります。デフォルトでは、Hive は統計を利用してクエリを最適化し、パフォーマンスを向上させます。 select count(*) as c from mytable
クエリを (フィルタリングなしで) 実行する場合、Hive は保存された統計に基づいてカウントを推定することがあります。ただし、これらの統計は常に正確または最新であるとは限りません。
この場合、統計は master_id
列に null 値を含む行が多数あることを示している可能性があります。フィルター master_id is not null
を追加すると、Hive は統計を再評価し、ほとんどの行に null 以外の値が含まれていることを認識しました。これにより、カウントがより正確になり、顕著な不一致が排除されます。
問題を解決する方法
特に大幅に変更されたテーブルや最近分析されていないテーブルを操作する場合に、正確な数を取得するには、次のことをお勧めします。
hive.compute.query.using.stats=false
を設定します。 ANALYZE TABLE
コマンドを使用してテーブル統計を手動で更新し、その精度を確保します。 hive.stats.autogather=true
などのデータ操作中に統計を自動的に収集するには、INSERT OVERWRITE
を設定します。 以上が「WHERE master_id IS NOT NULL」句を追加すると、Hive の「COUNT(*)」が増加するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。