遇到這麼乙個需求,輸入資料為乙個id對應多個name,要求輸出資料為id是唯一的,name隨便取乙個就可以。
執行以下hive ql語句:
1
2
3
4
5
6
select
sid,
class_id
from
table2
group by sid;
會報錯:
1
failed:error insemantic analysis:line1:18expression notingroup 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
111211
312412
516713
總結:
hive不允許直接訪問非group by欄位;對於非group by欄位,可以用hive的collect_set函式收集這些字段,返回乙個陣列;使用數字下標,可以直接訪問陣列中的元素;
參考文章:
Hive Group By 常見錯誤
遇到這麼乙個需求,輸入資料為乙個id對應多個name,要求輸出資料為id是唯一的,name隨便取乙個就可以。執行以下hive ql語句 12 3456 select sid,class id from table2 group by sid 會報錯 1failed error insemantic ...
hive group by聚合函式增強
1.grouping sets grouping sets子句都可以根據union連線的多個group by查詢進行邏輯表示 select a,b,sum c from tab1 group by a,b grouping sets a,b a,b,等價於select a,b,sum c from ...
C 常見錯誤
1.用malloc或farmalloc動態分配記憶體時,如 char buffer buffer char malloc 300 因為並不是在所有的情況下,都會分配成功 所以應加 if buffer null 2.char far buffer buffer char far farmalloc s...