1. 程式人生 > >關於hive中的count與group by的總結

關於hive中的count與group by的總結

Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行資料處理。 

注意:group by 是先排序後分組; 

count :.

1、 並不是說group by和count()操作不能同時使用,只是說查出來的東西不一樣,每個都有其應用的情況,如本例:最開始方法查出來的就是分組以後每個分組的記錄條數,如果程式中要計算每個分組的記錄條數,恰恰用這種方法。

2 、要更多靠資料庫去解決問題。

3 、意識到子查詢的威力,當你遇到解決不了的問題的時候,可以試試用子查詢去解決。(實踐證明的)

count(distinct colA)的操作也可以用group by的方式完成,具體程式碼如下:

select count(distinct colA) from table1;

select count(1) from (select colA from table1 group by colA)alias_1;

這兩者最後得出的結果是一致的,但是具體的實現方式,有什麼不同呢?

上面兩種方式本質就是時間與空間的權衡。

distinct需要將colA中的所有內容都載入到記憶體中,大致可以理解為一個hash結構,key自然就是colA的所有值。因為是hash結構,那運算速度自然就快。最後計算hash中有多少key就是最終的結果。

那麼問題來了,在現在的海量資料環境下,需要將所有不同的值都存起來,這個記憶體消耗,是可想而知的。所以如果資料量特別大,可能會out of memory。。。

group by的實現方式是先將colA排序。排序大家都不陌生,拿最見得快排來說,時間複雜度為O(nlogn)O(nlogn),而空間複雜度只有O(1)O(1)。這樣一來,即使資料量再大一些,group by基本也能hold住。但是因為需要做一次O(nlogn)O(nlogn) 的排序,時間自然會稍微慢點。。。

總結起來就是,count(distinct)吃記憶體,查詢快;group by空間複雜度小,在時間複雜度允許的情況下,可以發揮他的空間複雜度優勢