hive 中的多列進行group by查詢方法

2021-06-20 12:34:56 字數 1173 閱讀 8081

from 

在工作中用hive進行資料統計的時候,遇到乙個用group by 進行查詢的問題,需要統計的字段為

gid,sid,user,roleid,time,status,map_id,num

其中time欄位為時間戳形式的,統計要求為將各個字段按照每個小時的num總數進行統計

開始的時候寫的hive sql為

select gid,sid,user,roleid,time,status,map_id,sum(num) from test group by gid,sid,user,roleid,from_unixtime(time,'yyyymmddhhmmss'),9,2),time,status,map_id;

在hive中執行後發現結果不對,hive是按照time欄位進行的group by,於是將group by中的time欄位去掉

select gid,sid,user,roleid,time,status,map_id,sum(num) from test group by gid,sid,user,roleid,from_unixtime(time,'yyyymmddhhmmss'),9,2),status,map_id;

hive返回錯誤failed: error in semantic analysis: line 1:27 expression not in group by key time

如果修改sql為

select gid,sid,user,roleid,from_unixtime(time,'yyyymmddhhmmss'),9,2),status,map_id,sum(num) from test group by gid,sid,user,roleid,from_unixtime(time,'yyyymmddhhmmss'),9,2),status,map_id;

可以按照小時進行匯**計,可是欄位time不是想要顯示的結果,最後經過google查到方法

select gid,sid,user,roleid,collect_set(time)[0],status,map_id,sum(num) from test  group by gid,sid,user,roleid,substr(from_unixtime(time,'yyyymmddhhmmss'),9,2),status,map_id;

參考**

看來對hive的udf函式還是掌握的不夠,需要多學習

hive中的多行多列轉換

1.多行轉多列 原表test表儲存格式如下,希望進行優化 name subject score 張三語文 90張三 數學85 張三英語 92李四 語文75 李四數學 90李四 英語80 王五語文 95王五 數學100 王五英語98 name chinese math english 張三90 859...

Hive 多列轉行 (if函式)

最近有個專案需要做資料匯出 基於底層寬表 具體業務邏輯在這就不詳細介紹,以下是具體實現方案 列轉換 方案一 case when 與max 或sum select from select dzgs dqbm,max bs wks bs wks,max bs jxz bs jxz,max bs ywc ...

hive多行轉多列

一 需求 需要將多行的資料,按照某個維度轉換為一行。轉換前 轉換後 db price area name 為 東北 的total price actual db qty area name 為 東北 的qty。二 解決方案 1 sql select brand,max case when area ...