Hive使用多个lateral view explode拆分多列出现行重复问题
Hive多分隔符字段按位置拆分去重解决方案
问题根因
你当前使用多个explode分别拆分三个字段的写法,会生成三个拆分后数组的笛卡尔积:当每个字段拆分后得到4个元素时,单条原始数据会生成444=64行数据,这就是你遇到重复行问题的核心原因。
解决方案
使用Hive内置的posexplode函数替代普通explode:posexplode拆分数组后会同时返回元素位置索引和元素值,通过索引匹配三个字段的对应位置元素,就能避免笛卡尔积,实现一一对应。
最优查询语句
select Ref_No as Ref, ccy_arr[pos] as ccy, amt_arr[pos] as amt, tag_arr[pos] as tag_1 from ( -- 预计算三个字段的拆分结果,避免重复计算 select Ref_No, split(Currency, "\\^") as ccy_arr, split(Amount, "\\^") as amt_arr, split(Tag, "\\^") as tag_arr from table1 ) t -- 对任意一个数组做位置拆解,此处以Currency字段的拆分结果为例 lateral view posexplode(ccy_arr) tmp as pos, ccy -- 过滤原始字符串末尾^产生的空值元素 where trim(ccy) != '' -- 可选:增加长度校验,避免三个字段元素数量不一致导致的错位问题 and pos < size(amt_arr) and pos < size(tag_arr)
样例输出
针对你给出的测试数据,执行上述语句后会得到4行正确的结构化结果:
| Ref | ccy | amt | tag_1 |
|---|---|---|---|
| EBDR001 | usd | 240 | DBC |
| EBDR001 | usd | 300 | ODA |
| EBDR001 | usd | 210 | ICA |
| EBDR001 | usd | 500 | DRA |
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

