首頁 >資料庫 >mysql教程 >為什麼我的 Hive'COUNT(*)”在過濾非空值後會增加?

為什麼我的 Hive'COUNT(*)”在過濾非空值後會增加?

DDD
DDD原創
2025-01-12 10:55:44384瀏覽

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

*Hive 的 `COUNT()` 過濾後產生意外結果**

使用 Hive 的 COUNT(*) 函數有時會產生令人驚訝的結果。 考慮一個表格“mytable”,其中有一列“master_id”。

初始計數查詢顯示 1,129,563 行:

<code class="language-sql">SELECT COUNT(*) AS c FROM mytable;</code>

但是,過濾非空「master_id」值會意外地將計數增加到 1,134,041:

<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;</code>

這是令人費解的,特別是因為檢查空「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. 啟用自動統計資訊收集: 設定 Hive 在 INSERT OVERWRITE 操作期間自動更新統計資訊:

    <code class="language-sql">SET hive.stats.autogather=true;</code>

透過實作其中一種方法,您可以確保您的 COUNT(*) 查詢始終傳回準確的行計數。

以上是為什麼我的 Hive'COUNT(*)”在過濾非空值後會增加?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn