例如数据长这个样子
| id | name | value |
| 1 | 张三 | 1,2,3 |
| 2 | 李四 | 4,5,6,7 |
想要这个样子
| id | name | value |
| 1 | 张三 | 1 |
| 1 | 张三 | 2 |
| 1 | 张三 | 3 |
| 2 | 李四 | 4 |
| 2 | 李四 | 5 |
| 2 | 李四 | 6 |
| 2 | 李四 | 7 |
实现:
select
TRANS_ARRAY(2,',',id,name,value) as (new_id,new_name,new_value)
from table
函数声明
:
trans_array (num_keys, separator, key1,key2,…,col1, col2,col3) as (key1,key2,…,col1, col2)
用途:用于将一行数据转为多行的
UDTF
,将列中存储的以固定分隔符格式分
隔的数组转为多行。
参数说明:
num_keys: Bigint 类型常量,必须
>=0
。在转为多行时作为转置
key
的列的个数。
Key 是指在将一行转为多行时,在多行中重复的列。
separator:String
类型常量,用于将字符串拆分成多个元素的分隔符。为空时报异常。
keys:
转置时作为
key
的列,
个数由
num_keys
指定。如果
num_keys
指定所有的列都作为
key
(即
num_keys
等于所有列的个数),则只返回一行。
cols:
要转为行的数组,
keys
之后的所有列视为要转置的数组,必须为String 类型,存储的内容是字符 串格式的数组,如
"Hangzhou;Beijing;shanghai",是以
";"
分隔的数组。
返回值:转置后的行,新的列名由
as
指定。作为
key
的列类型保持不变,其余所有的列是 String
类型。拆分成的行 数以个数多的数组为准,不足的补
NULL
。
备注:
UDTF
使用上有一些限制
所有作为
key
的列必须处在前面,而要转置的列必须放在后面。
在一个
select
中只能有一个
udtf
,不可以再出现其它的列
不可以与
group by/cluster by/distribute by/sort by
一起使用。
例,表中的数据如
Login_id LOGIN_IP LOGIN_TIME
wangwangA 192.168.0.1,192.168.0.2 20120101010000,20120102010000
则
trans_array(1, ",", login_id, login_ip, login_time) as (login_id,login_ip,login_time)
产生的数据是:
Login_id Login_ip Login_time
wangwangA 192.168.0.1 20120101010000
wangwangA 192.168.0.2 20120102010000
如果表中的数据是:
Login_id Login_ip Login_time
wangwangA 192.168.0.1,192.168.0.2 20120101010000
则对数组中不足的数据补
NULL
:
Login_id Login_ip Login_time
wangwangA 192.168.0.1 20120101010000
wangwangA 192.168.0.2 NULL