ODPS的TRANS_ARRAY应用

–qlr拆分
drop table if exists tmp_fcxx_qlr;
create table tmp_fcxx_qlr as
select zl
,qlr_old
,qlr_new
from (
select trans_array(2, ‘;’, zl, qlr, qlr) as (zl, qlr_old, qlr_new)
from dc01_rkk_ml_zcxx_bdcqrxx
where dt = ‘ b d p . s y s t e m . b i z d a t e ′ a n d r e g e x p e x t r a c t ( q l r , ′ ( [ [ : p u n c t : ] ] ) ′ ) = ′ ; ′ u n i o n s e l e c t t r a n s a r r a y ( 2 , ′ , ′ , z l , q l r , q l r ) a s ( z l , q l r o l d , q l r n e w ) f r o m d c 0 1 r k k m l z c x x b d c q r x x w h e r e d t = ′ {bdp.system.bizdate}' and regexp_extract(qlr, '([[:punct:]])') = ';' union select trans_array(2, ',', zl, qlr, qlr) as (zl, qlr_old, qlr_new) from dc01_rkk_ml_zcxx_bdcqrxx where dt = ' bdp.system.bizdate′andregexpe​xtract(qlr,′([[:punct:]])′)=′;′unionselecttransa​rray(2,′,′,zl,qlr,qlr)as(zl,qlro​ld,qlrn​ew)fromdc01r​kkm​lz​cxxb​dcqrxxwheredt=′{bdp.system.bizdate}’
and regexp_extract(qlr, ‘([[:punct:]])’) = ‘,’
union
select trans_array(2, ‘/’, zl, qlr, qlr) as (zl, qlr_old, qlr_new)
from dc01_rkk_ml_zcxx_bdcqrxx
where dt = ‘ b d p . s y s t e m . b i z d a t e ′ a n d r e g e x p e x t r a c t ( q l r , ′ ( [ [ : p u n c t : ] ] ) ′ ) = ′ / ′ u n i o n s e l e c t t r a n s a r r a y ( 2 , ′ 、 ′ , z l , q l r , q l r ) a s ( z l , q l r o l d , q l r n e w ) f r o m d c 0 1 r k k m l z c x x b d c q r x x w h e r e d t = ′ {bdp.system.bizdate}' and regexp_extract(qlr, '([[:punct:]])') = '/' union select trans_array(2, '、', zl, qlr, qlr) as (zl, qlr_old, qlr_new) from dc01_rkk_ml_zcxx_bdcqrxx where dt = ' bdp.system.bizdate′andregexpe​xtract(qlr,′([[:punct:]])′)=′/′unionselecttransa​rray(2,′、′,zl,qlr,qlr)as(zl,qlro​ld,qlrn​ew)fromdc01r​kkm​lz​cxxb​dcqrxxwheredt=′{bdp.system.bizdate}’
and regexp_extract(qlr, ‘([[:punct:]])’) = ‘、’
) t
where qlr_old is not null
;
trans_array (num_keys, separator, key1,key2,…,col1, col2,col3) as (key1,key2,…,col1, col2)
trans_array(2, ‘;’, zl, qlr, qlr) as (zl, qlr_old, qlr_new) – > 2指两列,zl / qlr两列,拆分第3列qlr,最后生成3列表:zl / 老权利人 / 新权利人

  • 命令说明
    将一行数据转为多行的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。

上一篇:raft中集群成员变更


下一篇:搬-Android - Wi-Fi Tutorial[转]