当前位置:   article > 正文

odps TRANS_ARRAY 列一行转多行_odps数组按列展开

odps数组按列展开

例如数据长这个样子

idnamevalue
1张三1,2,3
2李四4,5,6,7

想要这个样子

idnamevalue
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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/725850
推荐阅读
相关标签
  

闽ICP备14008679号