首頁 >資料庫 >mysql教程 >為什麼具有非空條件的 Hive'COUNT(*)”返回的計數高於簡單的'COUNT(*)”?

為什麼具有非空條件的 Hive'COUNT(*)”返回的計數高於簡單的'COUNT(*)”?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-12 06:59:46263瀏覽

Why Does a Hive `COUNT(*)` with a Non-Null Condition Return a Higher Count Than a Simple `COUNT(*)`?

*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中文網其他相關文章!

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