淺析Hive的group by和count(distinct)

    首先,Hive的group by和count(distinct)都是去除重複的數據,某種程度上來說,兩者產生的結果是一樣的。

    實例代碼:

select a,count(distinct b) from t group by a
select tt.a,count(tt.b) from (select a,b from t group by a,b)tt group by tt.a

    上面兩句代碼產生的結果是一樣的,但是兩者從效率和空間複雜度上來講,是有很大的差別的。

    distinct會將b列所有的數據保存到內存中,形成一個類似hash的結構,速度是十分的塊;但是在大數據背景下,因爲b列所有的值都會形成以key值,極有可能發生OOM。

    group by會先把b列的值進行排序,如果以快速派序來說的話,他的空間複雜度就是O(1),時間複雜度是O(nlogn),這樣在大數據的環境下,只有排序階段會比較慢,時間複雜度是O(nlogn)。

    兩者比較來說,distinct 耗費內存,但是效率極高,但是數據較大時,可能會產生OOM;group by如果在時間複雜度允許的情況下,可以展現出突出的空間複雜度的優勢。

    最後,對於Hive來說,含有distinct的HQL語句,如果遇到瓶頸,想要調優,第一時間都是想到用group by來替換distinct來實現對數據的去重。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章