Hive Group By 常見錯誤

2021-09-07 19:19:17 字數 1417 閱讀 6516

遇到這麼乙個需求,輸入資料為乙個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...