Hive之行轉列和列轉行


行轉列是指多行數據轉換為一個列的字段。

列轉行是值某一個字段轉換成多行顯示。

 

行轉列

Hive行轉列用到的函數:
concat(str1,str2,...)  --字段或字符串拼接
concat_ws(sep, str1,str2) --以分隔符拼接每個字符串
collect_set(col) --將某字段的值進行去重匯總,產生array類型字段

測試數據(來源:oracle自帶數據集emp)

deptno  |  ename  
+---------+---------+--+
20        SMITH   
30        ALLEN   
30        WARD    
20        JONES   
30        MARTIN  
30        BLAKE   
10        CLARK   
20        SCOTT   
10        KING    
30        TURNER  
20        ADAMS   
30        JAMES   
20        FORD    
10        MILLER  
View Code

建表

create table emp(
deptno int,
ename string
) row format delimited fields terminated by '\t';

插入數據:

load data local inpath "/opt/data/emp.txt" into table emp;

行轉列,COLLECT_SET(col):函數只接受基本數據類型,它的主要作用是將某字段的值進行去重匯總,產生array類型字段。

select deptno,concat_ws("|",collect_set(ename)) as ems from emp group by deptno;

 

Hive列轉行
EXPLODE(col):將hive一列中復雜的array或者map結構拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解釋:用於和split, explode等UDTF一起使用,它能夠將一列數據拆成多行數據,在此基礎上可以對拆分后的數據進行聚合。

測試數據

10    CLARK|KING|MILLER
20    SMITH|JONES|SCOTT|ADAMS|FORD
30    ALLEN|WARD|MARTIN|BLAKE|TURNER|JAMES

建表

create table emp3(
deptno int,
names array<string>)
row format delimited fields terminated by '\t'
collection items terminated by '|';

插入數據

load data local inpath "/opt/data/emp3.txt" into table emp3;

列轉行

select deptno,name from emp3 lateral view explode(names) tmp_tbl as name;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM