这个需求会稍微复杂一点: 首先我们有一张 table_A表:
id | code |
---|
1001 | 0,1,3,4 | 1002 | 2,3 | 1003 | 0,24 |
还有一张 code表
code | code_value |
---|
0 | 法人 | 1 | 董事 | 2 | 股东 | 3 | 监事 | 4 | 高管 |
我们现在的需求是想把code表的value按照code值给映射回table_A ,如下:
id | code |
---|
1001 | 法人,董事,监事,高管 | 1002 | 股东,监事 | 1003 | 法人,股东,高管 |
使用Hive SQL来实现具体如下:
一、先进行按字段拆分,列转行 其语法如下:
select f.id, f.code, new_code
from
(select id,code_value from table_A
where 字段x = 条件x
) f
lateral view explode(split(a.code, ',')) myTable as new_code;
这一步会将code字段的0,1,2,3拆分开。 注意,这里的new_code不属于f表,不需要加f.。
二、拆分完成以后进行case when映射
select t.id, t.code,
case new_code
when '0' when '法人'
when '1' when '董事'
when '2' when '股东'
when '3' when '监事'
when '4' when '高管'
end as new_value
from
(select f.id, f.code,new_code
from
(select id,code_value from table_A
where 字段x = 条件x
) f
lateral view explode(split(a.code, ',')) myTable as new_code
) t;
三、映射结束以后再使用 concat_ws进行列转行
select v.id, concat_ws(',', collect_list(new_value)) as concat_value
from
(
select t.id, t.code,
case new_code
when '0' when '法人'
when '1' when '董事'
when '2' when '股东'
when '3' when '监事'
when '4' when '高管'
end as new_value
from
(select f.id, f.code,new_code
from
(select id,code_value from table_A
where 字段x = 条件x
) f
lateral view explode(split(a.code, ',')) myTable as new_code
) t
) v
group by v.id;
第三步结束就可以直接打成我们的需求了。 但是一般实际的生产过程中,表会复杂很多,也会有其他的字段,这里可能最终还需要进行把多余的字段join回去,这里不在赘述。
|