Expression not in GROUP BY key ‘ xxx’
遇到這么一個需求,輸入數據為一個ID對應多個name,要求輸出數據為ID是唯一的,name隨便取一個就可以。
執行以下hive ql語句:
1
2
3
4
5
6
|
SELECT
sid,
class_id
FROM
table2
GROUP BY sid ;
|
會報錯:
1
|
FAILED: Error in semantic analysis: Line 1:18 Expression not in GROUP BY key 'class_id'
|
查了一下,HIVE有這么一個函數collect_set,類似於mysql的group_concat函數,把每個分組的其他字段,按照逗號進行拼接,得到一個最終字符串:
1
2
3
|
collect_set(col)
返回類型:
array
解釋:返回一個去重后的對象集合
|
將上述的QL語句改一下:
1
|
select sid,collect_set(class_id) from table2 group by sid;
|
結果是這樣的:
1
2
3
4
5
6
|
1 [11,12,13]
2 [11,14]
3 [12,15]
4 [12,13]
5 [16,14]
7 [13,15]
|
這個時候,我們就可以針對第二列做一些計數、求和操作,分別對應到Hive的聚合函數count、sum。
對應到本文的目的,直接從數組獲取第一個元素就達到目的了,這樣做:
1
|
select sid,collect_set(class_id)[0] from table2 group by sid;
|
結果如下:
1
2
3
4
5
6
|
1 11
2 11
3 12
4 12
5 16
7 13
|
總結:
- Hive不允許直接訪問非group by字段;
- 對於非group by字段,可以用Hive的collect_set函數收集這些字段,返回一個數組;
- 使用數字下標,可以直接訪問數組中的元素;
參考文章:http://wangjunle23.blog.163.com/blog/static/117838171201310222309391/
本文地址:http://www.crazyant.net/1600.html