Hive纵向表转横向表

问题描述:

有这样一张维度表(id name),存放部门的id,与部门负责人

000	Liam	
000001	Noah	
000001001	Oliver	
000002	Emma
001	Elijah
001001	James
001002	Charlotte
001001001	William
001002001	Amelia
002	Benjamin
002001	Lucas
002001001	Theodore

需要合并相同部门的人,也就是相同前缀的id的多行记录,合并到一行记录上

期望结果(为空表示该条记录只有对应的二级部门,没有三级部门)

000	Liam	000002	Emma	NULL	NULL	
000	Liam	000001	Noah	000001001	Oliver	
001	Elijah	001001	James	001001001	William	
001	Elijah	001002	Charlotte	001002001	Amelia	
002	Benjamin	002001	Lucas	002001001	Theodore

实际案例:

建表

create table test.dept(id string, name string) row format delimited fields terminated by '\t';
load data inpath '/user/admin/dept.txt' into table dept;
select * from test.dept;

分析

因为源表是将同一部门id的数据存在了不多行,所以首先我们需要找出能关联的键,也就是下一级的前3位部门id等于上一级的部门id

子查询先筛选出各级部门id的数据,与上一级通过前三位关联

SQL

SELECT t1.id AS id_level1,
       t1.name AS name_level1,
       t2.id id_level12,
       t2.name AS name_level2,
       t3.id id_level3,
       t3.name AS name_level3
FROM
  (SELECT *
   FROM test.dept
   WHERE length(id)=3)t1
LEFT JOIN
  (SELECT *
   FROM test.dept
   WHERE length(id)=6)t2 ON t1.id=substr(t2.id,0,3)
LEFT JOIN
  (SELECT *
   FROM test.dept
   WHERE length(id)=9)t3 ON t2.id=substr(t3.id,0,6)
ORDER BY id_level3;

结果符合预期

id_level1	name_level1	id_level12	name_level2	id_level3	name_level3	
000	Liam	000002	Emma	NULL	NULL	
000	Liam	000001	Noah	000001001	Oliver	
001	Elijah	001001	James	001001001	William	
001	Elijah	001002	Charlotte	001002001	Amelia	
002	Benjamin	002001	Lucas	002001001	Theodore
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DanielMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值