hive一行變多行及多行變一行
場景
| name | alias |
|---|---|
| zhaoqiansun | abc def ghi |
處理數據時需要將上表處理成為下面的形式:
| name | alias |
|---|---|
| zhaoqiansun | abc |
| zhaoqiansun | def |
| zhaoqiansun | ghi |
辦法
- 使用
Lateral view和explode()來實現,命令如下:
hive> select name, single_alias from test lateral view explode(split(alias, ' ')) test_alias as single_alias;
-
explode()是將array數據分解為單獨行的函數,explode([1, 2, 3]) 處理后就變成了:1 2 2 -
split是將string按照指定字符分解的函數返回結果為array
-
lateral view的功能是將某數據作為一個虛擬的column
多行變一行,逆操作
列轉為行演示:
hive (hive)> select name,concat_ws(',',collect_set(subject)) from student group by name;
huahua chinese,math
xiaoming english,chinese,mathhive (hive)> select name,concat_ws(',',collect_set(concat(subject,'=',score))) from student group by name;
huahua chinese=80,math=89.5
xiaoming english=92,chinese=98,math=89.5
如果不使用 concat_ws(連接函數)是這樣的:
hive> select * from test;
OK
zhao 15 20170807
zhao 14 20170809
hive> select name, collect_set(age) from test group by name;
zhao [15,14]
