*Hive 的 `COUNT()` 過濾後產生意外結果**
使用 Hive 的 COUNT(*)
函數有時會產生令人驚訝的結果。 考慮一個表格“mytable”,其中有一列“master_id”。
初始計數查詢顯示 1,129,563 行:
SELECT COUNT(*) AS c FROM mytable;
但是,過濾非空「master_id」值會意外地將計數增加到 1,134,041:
SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;
這是令人費解的,特別是因為檢查空「master_id」值的查詢回傳零:
SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NULL;
差異背後的原因
這種不一致源自於 Hive 依賴表統計資訊來進行查詢最佳化。 缺少 COUNT(*)
子句的初始 WHERE
查詢可能會使用估計統計資訊而不是全表掃描。 新增 WHERE
子句會強制執行完整的表掃描,從而獲得精確且更高的行數。
如何得到準確的計數
為了確保準確的結果,請考慮以下解決方案:
停用基於統計的最佳化:防止 Hive 使用統計進行查詢最佳化:
SET hive.compute.query.using.stats=false;
手動更新表格統計資料:使用ANALYZE TABLE
指令重新整理表的統計資料:
ANALYZE TABLE mytable COMPUTE STATISTICS;
啟用自動統計資訊收集: 設定 Hive 在 INSERT OVERWRITE
操作期間自動更新統計資訊:
SET hive.stats.autogather=true;
透過實作其中一種方法,您可以確保您的 COUNT(*)
查詢始終傳回準確的行計數。
以上是為什麼我的 Hive'COUNT(*)”在過濾非空值後會增加?的詳細內容。更多資訊請關注PHP中文網其他相關文章!