*Hive計數()異常:非空條件的SELECT回傳較高的計數**
在Hive中,觀察到一種特殊行為:帶有非空條件的行計數回傳的值高於所有行的計數。讓我們來調查一下這個異常。
名為「mytable」的表格包含一個名為「master_id」的欄位。使用count(*)函數,我們得到:
<code class="language-sql">select count(*) as c from mytable; c 1129563</code>
但是,當增加一個條件來只計算「master_id」的非空值時,我們得到一個更大的計數:
<code class="language-sql">select count(*) as c from mytable where master_id is not null; c 1134041</code>
令人驚訝的是,一個單獨的查詢顯示「master_id」沒有空值:
<code class="language-sql">select count(*) as c from mytable where master_id is null; c 0</code>
為什麼在沒有空值的情況下,新增非空條件會產生更高的計數?
最可能的解釋在於Hive使用統計資料。預設情況下,Hive利用統計資料透過估計行數來最佳化查詢規劃。但是,這些統計資料並不總是準確的。
為了解決這個問題,透過設定參數來停用統計資訊的用法:
<code class="language-sql">set hive.compute.query.using.stats=false;</code>
重新執行查詢現在應該會產生一致的結果。
或者,您可以使用ANALYZE TABLE語法手動計算統計資料。
此外,設定hive.stats.autogather=true
將在INSERT OVERWRITE
操作期間自動收集統計信息,確保更準確的統計信息並防止此類異常。
以上是為什麼具有非空條件的 Hive'COUNT(*)”返回的計數高於簡單的'COUNT(*)”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!