1. 程式人生 > >Hive之GROUP BY詳解

Hive之GROUP BY詳解

pre 單元格 設置 有一個 sql語句 ima style class 性能

一,GROUP BY 執行理解

先來看下表1,表名為test:

技術分享圖片

表1

  執行如下SQL語句:

SELECT name from test GROUP BY name ;

你應該很容易知道運行的結果,沒錯,就是下表2:

技術分享圖片

表2

  可是為了能夠更好的理解“group by”多個列“和”聚合函數“的應用,我建議在思考的過程中,由表1到表2的過程中,增加一個虛構的中間表:虛擬表3。下面說說如何來思考上面SQL語句執行情況:

1.FROM test:該句執行後,應該結果和表1一樣,就是原來的表。

2.FROM test Group BY name:該句執行後,我們想象生成了虛擬表3,如下所圖所示,生成過程是這樣的:group by name,那麽找name那一列,具有相同name值的行,合並成一行,如對於name值為aa的,那麽<1 aa 2>與<2 aa 3>兩行合並成1行,所有的id值和number值寫到一個單元格裏面。

技術分享圖片

3.接下來就要針對虛擬表3執行Select語句了:

(1)如果執行select *的話,那麽返回的結果應該是虛擬表3,可是id和number中有的單元格裏面的內容是多個值的,而關系數據庫就是基於關系的,單元格中是不允許有多個值的,所以你看,執行select * 語句就報錯了。

(2)我們再看name列,每個單元格只有一個數據,所以我們select name的話,就沒有問題了。為什麽name列每個單元格只有一個值呢,因為我們就是用name列來group by的。

(3)那麽對於id和number裏面的單元格有多個數據的情況怎麽辦呢?答案就是用聚合函數,聚合函數就用來輸入多個數據,輸出一個數據的。如cout(id),sum(number),而每個聚合函數的輸入就是每一個多數據的單元格。

(4)例如我們執行select name,sum(number) from test group by name,那麽sum就對虛擬表3的number列的每個單元格進行sum操作,例如對name為aa的那一行的number列執行sum操作,即2+3,返回5,最後執行結果如下:

技術分享圖片

(5)group by 多個字段該怎麽理解呢:如group by name,number,我們可以把name和number 看成一個整體字段,以他們整體來進行分組的。如下圖技術分享圖片

(6)接下來就可以配合select和聚合函數進行操作了。如執行select name,sum(id) from test group by name,number,結果如下圖:

技術分享圖片

二 ,GROUP BY 與 DISTINCT 去重比較

  GROUP BY 與 DISTINCT都有去重的功能,具體例子如下:

技術分享圖片

技術分享圖片

SELECT aa from zhangtest  WHERE aa is not NULL GROUP BY aa ;

技術分享圖片

如果在select 中加入其它字段 ,而在GROUP BY中沒有,則會報錯,如下。

技術分享圖片

select col1,col2,count(1),sel_expr(聚合操作)  
from tableName  
where condition  
group by col1,col2  
having...  

註意:

(1):select後面的非聚合列必須出現在group by中(如上面的col1和col2)。

(2):除了普通列就是一些聚合操作。

group的特性:

(1):使用了reduce操作,受限於reduce數量,通過參數mapred.reduce.tasks設置reduce個數。

(2):輸出文件個數與reduce數量相同,文件大小與reduce處理的數量有關。

問題:

(1):網絡負載過重。

(2):出現數據傾斜(我們可以通過hive.groupby.skewindata參數來優化數據傾斜的問題)。

下面,看下hive group by distinct區別以及性能比較

有興趣的可以看下這篇博文,講解的比較清楚。

https://blog.csdn.net/xiaoshunzi111/article/details/68484426

結論:能用GROUP BY 的 不用 DISTINCT。

參考:https://blog.csdn.net/lzm1340458776/article/details/43231707

部分轉自:https://blog.csdn.net/hao1066821456/article/details/69556644

Hive之GROUP BY詳解