ホームページ > データベース > mysql チュートリアル > Null 以外の値をフィルタリングした後、Hive `COUNT(*)` が増加するのはなぜですか?

Null 以外の値をフィルタリングした後、Hive `COUNT(*)` が増加するのはなぜですか?

DDD
リリース: 2025-01-12 10:55:44
オリジナル
384 人が閲覧しました

Why Does My Hive `COUNT(*)` Increase After Filtering for Non-Null Values?

*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 句を追加すると、完全なテーブル スキャンが強制的に実行され、正確な行数が増加します。

正確なカウントを取得する方法

正確な結果を保証するには、次の解決策を検討してください:

  1. 統計ベースの最適化を無効にする: Hive がクエリの最適化に統計を使用しないようにします:

    <code class="language-sql">SET hive.compute.query.using.stats=false;</code>
    ログイン後にコピー
  2. テーブル統計を手動で更新する: ANALYZE TABLE コマンドを使用してテーブルの統計を更新します:

    <code class="language-sql">ANALYZE TABLE mytable COMPUTE STATISTICS;</code>
    ログイン後にコピー
  3. 自動統計収集を有効にする: INSERT OVERWRITE 操作中に統計を自動的に更新するように Hive を構成します:

    <code class="language-sql">SET hive.stats.autogather=true;</code>
    ログイン後にコピー

これらのメソッドのいずれかを実装すると、COUNT(*) クエリが一貫して正確な行数を返すようになります。

以上がNull 以外の値をフィルタリングした後、Hive `COUNT(*)` が増加するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート