2015-09-25 62 views
0

中值我有以下表T1:計算HIVE

key value 
1 38.76 
1 41.19 
1 42.22 
2 29.35182 
2 28.32192 
3 33.66 
3 33.47 
3 33.35 
3 33.47 
3 33.11 
3 32.98 
3 32.5 

我要計算每個密鑰組的中位數。根據documentation,percentile_approx函數應該適用於此。每個組的中位值是:

1 41.19 
2 28.83 
3 33.35 

然而,percentile_approx函數返回這些:

1 39.974999999999994 
2 28.32192 
3 33.23.0000000000004 

其中明確不是中值。

這是我跑的查詢:

select key, percentile_approx(value, 0.5, 10000) as median 
from t1 
group by key 

這似乎是不考慮每組一個值,從而導致錯誤的中位數。排序不會影響結果。有任何想法嗎?

回答

1

在Hive中,不能通過使用可用的內置函數直接計算中位數。以下查詢用於查找中位數。

set hive.exec.parallel=true; 
    select temp1.key,temp2.value 
    from 
     (
     select key,cast(sum(rank)/count(key) as int) as final_rank 
     from 
     (
     select key,value, 
     row_number() over (partition by key order by value) as rank 
     from t1 
    ) temp 
     group by key)temp1 
    inner join 
    (select key,value,row_number() over (partition by key order by value) as rank 
     from t1 )temp2 
     on 
     temp1.key=temp2.key and 
     temp1.final_rank=temp3.rank; 

上面的查詢通過排序鍵的值來查找每個鍵的row_number。最後,它將採取給出中值的每個鍵的中間row_number。另外我還添加了一個參數「hive.exec.parallel = true;」,它可以並行運行獨立任務。

+0

這是怎麼處理的情況下,當有偶數個值?此外,當你不使用任何聚合函數@Nithiyanandhan – Danzo

+0

我已經編輯了我的答案,你爲什麼在第一部分通過鍵分組?第一部分將根據密鑰對值進行排序並查找中間行號,第二部分將查找每個密鑰的行號。通過加入第一個結果和第二個結果,我們將得到密鑰的中位數。這也將是偶數場景。 – anand