【问题标题】:Multiple lateral view and explode in hive produce rows duplication多个横向视图和蜂巢中的爆炸产生行重复
【发布时间】:2021-12-12 11:06:10
【问题描述】:

我正在处理 4 列

Ref_No Currency Amount Tag
EBDR001 usd^usd^usd^usd^ 240^300^210^500^ DBC^ODA^ICA^DRA

我想要这种格式的数据

Ref_No Currency Amount Tag
EBDR001 usd 240 DBC
EBDR001 usd 300 ODA
EBDR001 usd 210 ICA
EBDR001 usd 500 DRA

我得到的结果

Ref_No Currency Amount Tag
EBDR001 usd 240 DBC
EBDR001 usd 240 DBC
EBDR001 usd 240 DBC
EBDR001 usd 240 DBC
EBDR001 usd 300 ODA
EBDR001 usd 300 ODA
EBDR001 usd 300 ODA
EBDR001 usd 300 ODA
EBDR001 usd 210 ICA
EBDR001 usd 210 ICA
EBDR001 usd 210 ICA
EBDR001 usd 210 ICA
EBDR001 usd 500 DRA
EBDR001 usd 500 DRA
EBDR001 usd 500 DRA
EBDR001 usd 500 DRA

像这样有超过一千行不同的 Ref_No.

我使用的查询是

select Ref,ccy,amt,tag_1 from table1
lateral view explode(split(ccy,"\\^")) myTable12 as ccy
lateral view explode(split(amt,"\\^")) myTable13 as amt
lateral view explode(split(tag_1 ,"\\^")) myTable14 as tag_1


【问题讨论】:

  • 问题与 MySQL 无关 - 删除错误的标签。

标签: sql arrays hive hiveql explode


【解决方案1】:

多侧视图产生笛卡尔积。解决方法是使用单侧视图poseexplode,拆分其他列得到数组,然后使用位置处理其他值。

有些列的末尾包含额外的^ 分隔符,请在拆分前将其删除。

演示:

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

可能的替代方案:

您可以在三个横向视图中使用poseexplode而不是explode和WHERE子句来匹配三个横向视图的位置,请参阅https://stackoverflow.com/a/59497463/2700344

您还可以使用三个 CTE,在其中对每个数组进行分解,然后将它们与主表 ON Ref 和 Pos LEFT JOIN,类似的解决方案在这里:https://stackoverflow.com/a/56244552/2700344

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2022-01-06
    • 1970-01-01
    • 2015-07-08
    • 2014-06-10
    • 2017-07-13
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多