目录
0 需求
表名:t11
表字段及内容:
a b
A/B 1/3
B/C/D 4/5/2
问题:成对提取数据,字段一一对应
输出结果如下所示:
a b
A 1
B 3
B 4
C 5
D 2
1 问题分析
(1)数据准备
create table t as
select 'A/B' as a,'1/3' as b
UNION ALL
select 'B/C/D' as a,'4/5/2' as b
(2)数据分析
本问题主要是不同字段中字符串的拆分并能将俩字段中的字符串一一对应。能产生这种一一对应效果的,只能使用Hive中posexplode()函数,该函数可以产生索引,利用索引值相当便可得到一一对应。
第一步:利用posexplode()函数进行列转行,并与原表进行侧连接。
生成的数据条数为:2*2+3*3=13
select
a,
b,
a_id,
a_inx,
b_id,
b_inx
from t
lateral view posexplode(split(a,'/')) t as a_id,a_inx
lateral view posexplode(split(b,'/')) t as b_id,b_inx
a b a_id a_inx b_id b_inx
B/C/D 4/5/2 0 B 0 4
B/C/D 4/5/2 0 B 1 5
B/C/D 4/5/2 0 B 2 2
B/C/D 4/5/2 1 C 0 4
B/C/D 4/5/2 1 C 1 5
B/C/D 4/5/2 1 C 2 2
B/C/D 4/5/2 2 D 0 4
B/C/D 4/5/2 2 D 1 5
B/C/D 4/5/2 2 D 2 2
A/B 1/3 0 A 0 1
A/B 1/3 0 A 1 3
A/B 1/3 1 B 0 1
A/B 1/3 1 B 1 3
第二步:过滤出索引相等的值
具体SQL如下:
sele