hive Sql列转行使用explode的注意事项-null值处理
日常工作中,我们经常会用Lateral View 结合explode将数据炸裂,但是该方法对应explode的内容是有非null限制的,否则就有可能造成数据缺失。
- 准备数据
create table person as
select '张三' as name,'武侠,科幻,动作' as movie
union all
select '李四' as name,'爱情,喜剧' as movie
union all
select '王五' as name,'' as movie
union all
select '赵六' as name,null as movie;
- 炸裂数据
select * from person lateral view explode(split(movie,',')) tmp as tmp_movie;
查看结果我们可以发现 ‘赵六’ 这条数据丢了,这有可能会导致我们最终的统计数据出现错误。
- 查找原因
通过定位我们可以发现 ‘赵六’ 这一行的movie字段为null,其split之后的结果自然也是为null,通过LATERAL VIEW explode之后会形成一个为null的view,这样无法关联出数据,该数据就会丢失。
- 如何解决
使用官方提供的LATERAL VIEW OUTER来进行解决,该方法类似于left outer join,即如果explode出来的结果为null,也会保留记录,只不过对应字段为null,改写后的语句如下:
select * from person lateral view outer explode(split(movie,',')) tmp as tmp_movie;