行轉列是指多行數據轉換為一個列的字段。
列轉行是值某一個字段轉換成多行顯示。
行轉列
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
建表
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;

