HIVE如何将单元格中的用逗号连接的数据拆分?

原始数据长这个样子

img

需要加工成这个样子

img

HIVE,请问如何实现?

写3个侧写函数,join到一起,1楼那个做法是错的
大概这样一个思路

with a as (
select 'zhangsan' name,'1,2' c1,'a,b' c2
union
select 'lisi' name,'2,3' c1,'b,d' c2
),
a1 as(
select concat(name,row_number() over ()) name,t1.c1
from a
lateral view explode(split(c1,",")) t1 as c1
),
a2 as(
select concat(name,row_number() over ()) name,t2.c2
from a
lateral view explode(split(c2,",")) t2 as c2
)
select substr(a1.name,0,length(a1.name) -1) name,c1,c2
from a1 join a2 on a1.name = a2.name

4种方法,以编号1为例:
1.只使用正则,适用于任意s q l语句:
首先我们查询列一中最多可以分成多少行:select max(regexp_count(编号1,','))+1 from test1; 结果为3.
然后我们创建一个序列seq_id为1到3(只要大于3即可)的序列表,计作test2.
最后我们进行一下表关联:
select a.姓名,a.编号1,b.seq_id,b.regexp_substr(a.编号1,'[^,]',1,b.seq_id)
from test1 a inner join test2 b
on b.seq_id<=(length(a.编号1)-length(replace(a.编号1,',',''))+1);
2.对于oracle数据库来说,可以使用递归与正则直接表示:
select distinct a.姓名,a.编号1,regexp_substr(a.编号1,'[^,]',1,level)
from test1 connect by level<=regexp_count(a.编号,',');
或者我们同样采用方法一,创建序列表的时候有一个简单的方法:create table test2 as
select level as seq_id from dual connect by level<=3;(level可替换为rownum)。
3.hive中posexplode 和 sqlit函数使用,网上有模版,这里不写了。
4.只使用递归,很繁琐,自己可以尝试写写!
如果经常遇到这类问题,可以自己编写一个函数,比如以第一个为例,我们创建一个1000行的序列表(完全满足正常需求),将表名,列名,符号作为参数,可以直接求出所需。

楼上两个人把我要说的都说完了呀这