-- ---- 测试环境准备 ---- ---- 创建测试表droptableifexists pub.test;createtable pub.test(
areaname string,areacode string,parentcode string
)row format delimited
fieldsterminatedby',';-- 创建测试数据-- values 不好使 why!INSERTintoTABLE pub.test
SELECT
t.*from(SELECT0) a
lateral view inline(array(
struct('a','0001','0'),struct('aa','00010001','0001'),
struct('ab','00010002','0001'),struct('ac','00010003','0001'),
struct('b','0002','0'),struct('ba','00020001','0002'),
struct('aaa','000100010001','00010001'),
struct('aaaa','0001000100010001','000100010001'),
struct('aaaaa','00010001000100010001','0001000100010001'))) t as areaname,areacode,parentcode;
执行hql脚本
-- ---- 查询插入结果 ---- ---- 创建临时表droptableifexists pub.test_temp;createtable pub.test_temp(
level1 struct<areaname:string,areacode:string,parentcode:string>,
level2 struct<areaname:string,areacode:string,parentcode:string>,
level3 struct<areaname:string,areacode:string,parentcode:string>,
level4 struct<areaname:string,areacode:string,parentcode:string>,
level5 struct<areaname:string,areacode:string,parentcode:string>);-- 1INSERT overwrite table pub.test_temp
SELECT
named_struct('areaname',t.areaname,'areacode',t.areacode,'parentcode',t.parentcode),
named_struct('areaname','','areacode','','parentcode',''),named_struct('areaname','','areacode','','parentcode',''),
named_struct('areaname','','areacode','','parentcode',''),named_struct('areaname','','areacode','','parentcode','')from pub.test t
where LENGTH(t.areacode)<=4;-- 2INSERTintotable pub.test_temp
SELECT
a.level1,
named_struct('areaname',t.areaname,'areacode',t.areacode,'parentcode',t.parentcode),
named_struct('areaname','','areacode','','parentcode',''),
named_struct('areaname','','areacode','','parentcode',''),named_struct('areaname','','areacode','','parentcode','')from pub.test t
join pub.test_temp a
on t.parentcode=a.level1.areacode;-- 3INSERTintotable pub.test_temp
SELECT
a.level1,a.level2,
named_struct('areaname',t.areaname,'areacode',t.areacode,'parentcode',t.parentcode),
named_struct('areaname','','areacode','','parentcode',''),named_struct('areaname','','areacode','','parentcode','')from pub.test t
join pub.test_temp a
on t.parentcode=a.level2.areacode;-- 4INSERTintotable pub.test_temp
SELECT
a.level1,a.level2,a.level3,
named_struct('areaname',t.areaname,'areacode',t.areacode,'parentcode',t.parentcode),
named_struct('areaname','','areacode','','parentcode','')from pub.test t
join pub.test_temp a
on t.parentcode=a.level3.areacode;-- 5INSERTintotable pub.test_temp
SELECT
a.level1,a.level2,a.level3,a.level4,
named_struct('areaname',t.areaname,'areacode',t.areacode,'parentcode',t.parentcode)from pub.test t
join pub.test_temp a
on t.parentcode=a.level4.areacode;-- 目标查询SELECT*FROM(SELECT
CONCAT('-->',t.level1.areaname,if(LENGTH(t.level2.areacode)>0,
CONCAT('-->',t.level2.areaname,if(LENGTH(t.level3.areacode)>0,
CONCAT('-->',t.level3.areaname,if(LENGTH(t.level4.areacode)>0,
CONCAT('-->',t.level4.areaname,if(LENGTH(t.level5.areacode)>0,
CONCAT('-->',t.level5.areaname),'')),'')),'')),''))as result,caseWHEN length(t.level5.areacode)>0THEN t.level5.areacode
WHEN length(t.level4.areacode)>0THEN t.level4.areacode
WHEN length(t.level3.areacode)>0THEN t.level3.areacode
WHEN length(t.level2.areacode)>0THEN t.level2.areacode
WHEN length(t.level1.areacode)>0THEN t.level1.areacode
ENDas areacode,caseWHEN length(t.level5.areaname)>0THEN t.level5.areaname
WHEN length(t.level4.areaname)>0THEN t.level4.areaname
WHEN length(t.level3.areaname)>0THEN t.level3.areaname
WHEN length(t.level2.areaname)>0THEN t.level2.areaname
WHEN length(t.level1.areaname)>0THEN t.level1.areaname
ENDas areaname,caseWHEN length(t.level5.parentcode)>0THEN t.level5.parentcode
WHEN length(t.level4.parentcode)>0THEN t.level4.parentcode
WHEN length(t.level3.parentcode)>0THEN t.level3.parentcode
WHEN length(t.level2.parentcode)>0THEN t.level2.parentcode
WHEN length(t.level1.parentcode)>0THEN t.level1.parentcode
ENDas parentcode,caseWHEN length(t.level5.parentcode)>0THEN5WHEN length(t.level4.parentcode)>0THEN4WHEN length(t.level3.parentcode)>0THEN3WHEN length(t.level2.parentcode)>0THEN2WHEN length(t.level1.parentcode)>0THEN1ENDaslevelfrom pub.test_temp t
)t
ORDERBY t.level;