标记
240 ^ 300年^ 210年^ 500年^
DBC ^ ODA ^ ICA ^半径标注
我正在使用4列
多个侧面视图生成笛卡尔积解决方案是使用单个横向视图posexplode,拆分其他列以获得数组,然后使用position来处理其他值。
有些列在末尾包含额外的^
分隔符,在分隔前将其删除。
演示:
with table1 as (--Data example, use your table instead
select 'EBDR001' Ref_No, 'usd^usd^usd^usd^' Currency, '240^300^210^500^' Amount, 'DBC^ODA^ICA^DRA' Tag
)
select Ref_No,
c.ccy,
split(t1.Amount,"\^")[c.pos] amt,
split(t1.Tag,"\^")[c.pos] tag
from ( --Remove extra delimiter at the end
select Ref_No,
regexp_replace(Currency,'\^$','') Currency,
regexp_replace(Amount,'\^$','') Amount,
regexp_replace(Tag,'\^$','') Tag
from table1
) t1
lateral view posexplode(split(t1.Currency,"\^")) c as pos, ccy
结果:
ref_no c.ccy amt tag
EBDR001 usd 240 DBC
EBDR001 usd 300 ODA
EBDR001 usd 210 ICA
EBDR001 usd 500 DRA
可能的替代品:
你可以在三个侧面视图中使用possexplode而不是explosion和WHERE子句来匹配三个侧面视图的位置,参见https://stackoverflow.com/a/59497463/2700344
你也可以使用三个cte,其中你posexplode每个数组,然后左连接与主表上Ref和Pos,类似的解决方案是在这里:https://stackoverflow.com/a/56244552/2700344.