*Hive の `COUNT()` によるフィルタリング後に予期しない結果が得られる**
Hive の COUNT(*)
関数を使用すると、場合によっては驚くべき結果が生じることがあります。 「master_id」列を持つテーブル「mytable」について考えてみましょう。
最初のカウントクエリでは 1,129,563 行が表示されます:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable;</code>
ただし、null 以外の「master_id」値をフィルタリングすると、カウントが予期せず 1,134,041 に増加します。
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;</code>
これは不可解です。特に、null の「master_id」値をチェックするクエリではゼロが返されるためです。
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NULL;</code>
不一致の背後にある理由
この不一致は、Hive がクエリ最適化のためにテーブル統計に依存していることに起因します。 最初の COUNT(*)
クエリには WHERE
句が欠けており、テーブル全体のスキャンの代わりに推定統計が使用される可能性があります。 WHERE
句を追加すると、完全なテーブル スキャンが強制的に実行され、正確な行数が増加します。
正確なカウントを取得する方法
正確な結果を保証するには、次の解決策を検討してください:
統計ベースの最適化を無効にする: Hive がクエリの最適化に統計を使用しないようにします:
<code class="language-sql">SET hive.compute.query.using.stats=false;</code>
テーブル統計を手動で更新する: ANALYZE TABLE
コマンドを使用してテーブルの統計を更新します:
<code class="language-sql">ANALYZE TABLE mytable COMPUTE STATISTICS;</code>
自動統計収集を有効にする: INSERT OVERWRITE
操作中に統計を自動的に更新するように Hive を構成します:
<code class="language-sql">SET hive.stats.autogather=true;</code>
これらのメソッドのいずれかを実装すると、COUNT(*)
クエリが一貫して正確な行数を返すようになります。
以上がNull 以外の値をフィルタリングした後、Hive `COUNT(*)` が増加するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。