原数据
posexplode函数的使用
需求:我想要对student这个字段进行行转列并且带有顺序号,
效果如下:
代码如下:
select
class,student_index + 1 as student_index,student_name
from
default.classinfo
lateral view posexplode(split(student,',')) t as student_index,student_name;
这个+1的原因是编号是从0开始的
多行炸裂需求的实现
需求:我们想基于两列explode,同时能够使学生和其成绩能够匹配。
即期望的效果如下:
错误实现
select
class,student_name,student_score
from
default.classinfo
lateral view explode(split(student,',')) sn as student_name
lateral view explode(split(score,',')) sc as student_score
效果如下:
这个实现思路就是错误的,如果我们分别对两列进行explode的话,假设每列都有三个值,那么最终会变成3 * 3 = 9行。但我们想要的结果只有三行。此时我们可以进行两次posexplode,姓名和成绩都保留对应的序号,即使变成了9行,我们通过where条件只保留序号相同的行即可。
正确实现
select
class,student_name,student_score
from
default.classinfo
lateral view posexplode(split(student,',')) sn as student_index_sn,student_name
lateral view posexplode(split(score,',')) sc as student_index_sc,student_score
where
student_index_sn = student_index_sc;