*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
子句會強制執行完整的表掃描,從而獲得精確且更高的行數。
如何得到準確的計數
為了確保準確的結果,請考慮以下解決方案:
停用基於統計的最佳化:防止 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>
啟用自動統計資訊收集: 設定 Hive 在 INSERT OVERWRITE
操作期間自動更新統計資訊:
<code class="language-sql">SET hive.stats.autogather=true;</code>
透過實作其中一種方法,您可以確保您的 COUNT(*)
查詢始終傳回準確的行計數。
以上是為什麼我的 Hive'COUNT(*)”在過濾非空值後會增加?的詳細內容。更多資訊請關注PHP中文網其他相關文章!