hive語句實現列轉行
阿新 • • 發佈:2018-12-16
建表語句
CREATE TABLE XXXX表( evel_id string DEFAULT NULL COMMENT 'xxxxid', object_id string DEFAULT NULL COMMENT '所屬物件', object_name string DEFAULT NULL COMMENT '所屬物件名稱', dept_id string DEFAULT NULL COMMENT '單位編碼', dept_name string DEFAULT NULL COMMENT '單位名稱', ......省略一堆欄位 rcount bigint DEFAULT NULL COMMENT '記錄屬性總數 ', qcount bigint DEFAULT NULL COMMENT '問題屬性總數', nqcount bigint DEFAULT NULL COMMENT '新增問題總數 ', sqcount bigint DEFAULT NULL COMMENT '解決問題總數 ', score decimal(5,2) DEFAULT NULL COMMENT '屬性分數', create_date timestamp DEFAULT NULL COMMENT '建立時間', update_date timestamp DEFAULT NULL COMMENT '更新時間', create_person string DEFAULT NULL COMMENT '建立人' ) COMMENT 'XXXX表'
原資料部分展示:
Oracle中列轉行語法,使用 unpivot函式
unpivot(欄位屬性 for 欄位別名 in(欄位1 as 別名1,欄位2 as 別名2 …))
select EPT_NAME as DEPT_NAME, OBJECT_NAME, OBJ_COUNT, ROUND(SUM(SCORE) / COUNT(*), 2) as SCORE from XXXX表 unpivot(SCORE for OBJ_COUNT in(RCOUNT as '屬性總數', QCOUNT as '問題屬性總數', SCORE as '得分')) where 1 = 1 AND SYS_ID = '1234567890' GROUP BY OBJECT_NAME, DEPT_NAME, OBJ_COUNT ORDER BY OBJECT_NAME;
實現效果:
hive中列轉行語法,使用explode函式
因為LATERAL VIEW explode(split(欄位,’,’))是將一個欄位拆分展示為多條資料顯示,所以使用CONCAT_WS語句,將多個欄位拼接起來,可以滿足將一條資料多個特定欄位展示為多條資料一個特定欄位。
LATERAL VIEW explode(split(CONCAT_WS(’,’,to_char(RCOUNT),to_char(QCOUNT),to_char(SCORE)),’,’)) mytable AS obj_view
select DEPT_NAME , OBJECT_NAME, ROUND(SUM(obj_view) / COUNT(*), 2) as SCORE from XXXX表 LATERAL VIEW explode(split(CONCAT_WS(',',to_char(RCOUNT),to_char(QCOUNT),to_char(SCORE)),',')) mytable AS obj_view where 1 = 1 AND SYS_ID = '1234567890' GROUP BY OBJECT_NAME, DEPT_NAME,obj_view ORDER BY OBJECT_NAME ;
實現效果為:
最近將解釋欄位新增上的語句
select DEPT_NAME ,
OBJECT_NAME,
substr(obj_view,1,INSTR(obj_view,'|')-1) OBJ_COUNT,
ROUND(SUM(substr(obj_view,INSTR(obj_view,'|')+1)) / COUNT(*), 2) as SCORE
from XXXX表
LATERAL VIEW explode(split(CONCAT_WS(',',
CONCAT_WS('|','屬性總數',to_char(RCOUNT)),
CONCAT_WS('|','問題屬性總數',to_char(QCOUNT)),
CONCAT_WS('|','得分',to_char(SCORE))),',')) mytable AS obj_view
where 1 = 1
AND SYS_ID = '1234567890'
GROUP BY OBJECT_NAME, DEPT_NAME,OBJ_COUNT
ORDER BY DEPT_NAME DESC,OBJECT_NAME;
效果和Oracle實現的列轉行效果一樣