背景:
工作中遇见一个问题,需要再hive中,将表info.age_info中一个字段中的内容进行拆分为多行,比如:
id | age |
a | 12_14_15 |
b | 12_14_15 |
将其拆分为:
id | age |
a | 12 |
a | 14 |
a | 15 |
b | 12 |
b | 14 |
b | 15 |
解决:
select temp.age_single
from info.age_info lateral view explode(split(age, '_')) temp as age_single
延伸:
我还需要age在拆分的过程中,保留索引,拆分成如下方式:
id | index | age |
a | 0 | 12 |
a | 1 | 14 |
a | 2 | 15 |
b | 0 | 12 |
b | 1 | 14 |
b | 2 | 15 |
方案:
select temp.index, temp.age_single
from info.age_info lateral view posexplode(split(age, '_')) temp as index, age_single
备注:只能在hive引擎上运行,spark引擎上报错,不能运行。
延伸:再后来的工作中,一个表中会存在两个字段,需要将其拆分,并且要求拆分后两个字段index相同的,需要再一条记录中。
解决方案:
第一步:先拆解一个字段。
第二步:再拆解第二个字段,然后第一步的结果left join第二步的结果。
select
a.globlid, a.index, a.age_single, b.horner
from
(
select globalid, temp.index, temp.age_single
from info.age_info lateral view posexplode(split(age, '_')) temp as index, age_single
)a
left join
(
select globalid, temp.index, temp.horner
from info.age_info lateral view posexplode(split(horner, '_')) temp as index, horner
)b
on a.globalid = b.globalid and a.index = b.index