Hive列转行总结

it2026-04-24  2

有张表分成八种情况,分别为:

账面库存X类 标准库存X类 待核销库存X类 待冲销库存X类 账面库存Y类 大众标准库存Y类 待核销库存Y类 待冲销库存Y类

于是考虑先使用拼接函数生成如下样式:

select concat(nvl(type1,''),nvl(type2,''),nvl(type3,''),nvl(type4,''),nvl(type5,'')) from student_test

建立测试表:

CREATE table student_test( stu_id string comment '学号', stu_name string comment '姓名', stu_type string comment '类型', courses string comment '各个科目', scores string comment '各个分数' ) comment '学生成绩表'; insert into student_test values ("1001", "张三","type1,type2,type3,type4,type5","语文,数学,英语,历史,地理", "88,87,94,86,84"), ("1002", "李四","type1,type2,type3,type4,type5", "语文,数学,英语,历史,地理", "78,89,75,79,68"), ("1003", "王五","type1,type2,type3,type4,type5", "语文,数学,英语,历史,地理", "98,97,91,93,92"), ("1004", "朱六","type1,type2,type3,type4,type5", "语文,数学,英语,历史,地理", "66,63,64,67,68");

具体测试代码如下:

select stu_id, stu_name,stu_types, course, score from student_test lateral view posexplode(split(stu_type, ',')) table_view1 as a, stu_types lateral view posexplode(split(courses, ',')) table_view1 as b, course lateral view posexplode(split(scores, ',')) table_view2 as c, score where a=b and b=c;

方法二: 不拼接,直接把八种情况写入到一行数据中,然后group by+union all(每组字段个数必须相同)

select stu_id , tu_name ,'type1' as type,course1 as course ​ ,score1 as score ​from test_table ​group by stu_id, stu_name​,course1,score1 union all select stu_id , tu_name ,'type2' as type,course2 as course ​ ,score2 as score ​from test_table ​group by stu_id, stu_name​,course2,score2 union all select stu_id , tu_name ,'type3' as type,course3 as course ​ ,score3 as score ​from test_table ​group by stu_id, stu_name​,course3,score3 union all select stu_id ,stu_name ,'type4' as type,course4 as course ​ ,score4 as score ​from test_table ​group by stu_id, stu_name​,course4,score4 union all select stu_id ,stu_name ,'type5' as type,course5 as course ​ ,score5 as score ​from test_table ​group by stu_id, stu_name​,course5,score5
最新回复(0)