Hive之distinct多字段中出現null問題

2021-09-02 10:00:20 字數 1058 閱讀 2166

在使用hive以多個字段作為唯一性依據進行統計時,如果某個字段出現大量null值,會發生統計結果不準確問題,解決辦法可以使用coalesce函式對空值進行替換。

導致統計值異常的原因主要是因為:1. 所有的null值會被歸併到一項;2. count結果並不會統計null項

假設原來是以及a,b兩個欄位去重後統計結果:

select count(distinct a,b) from tablename where ***;
在實踐中發現a,b都可能為空值,而且b值出現空值的概率非常大,在這種情況下,發現統計結果與預計相差較大。甚至在b值全為空時,統計結果為0,此時需要對a,b出現的空值,進行替換,比如下面將其替換為0;

實際上當a,b任一為null時, distinct結果項即為null(注意是null, 空字串可以正常計數)

select count(distinct coalesce(a,'0'),coalesce(b,'0')) from tablename where ***;
關於coalesce函式

將空值替換成其他值,返回第乙個非空值

coalesce(expression_1, expression_2, ...,expression_n)依次計算各引數表示式,遇到非null值即停止並返回該值。如果所有的表示式都是空值,最終將返回乙個空值。

關於hive distinct

使用disticnt函式,所有的資料只會shuffle到乙個reducer上,導致reducer資料傾斜嚴重,當資料量較大時,執行速度較慢。

可以通過group by進行優化

select count(*) from (select coalesce(a,'0'),coalesce(b,'0') from tablename where xx group by a,b)t;
此外hive中還有order by,sort by, distribute by, cluster by,可依據具體場景選擇使用。

distinct多字段去重查詢問題

對於很多初學者來說distinct的單字段去重是很容易理解和使用的,但是有些初學者就會有這樣的疑問,如果distinct放在多個字段前面作用會是怎樣的呢?這裡舉個簡單易懂的例子 多字段去重sql語句 select distinct id,aa,bb from tname 上述語句是查詢欄位id aa...

Hive針對distinct的優化 二

之前一篇針對單個count distinct 的優化,本文來講講對多個count distinct 的優化。優化是在之前單個count的基礎上,通過使用union all以及視窗分析函式lag的結合來進行的。具體思路如下。select pid,c1,c2 from select pid,c1,lag...

Hive知識之Hive基礎

5 hive的基本操作 5.2 資料表相關操作 6 資料的匯入和匯出 1 hive簡介 2 hive與傳統關係型資料庫的比較 專案hive rdbms 查詢語言 hqlsql 資料儲存 hdfs raw device or local fs 執行mapreduce excuter 執行延遲高低 處理...