hivesql之lateral view explode遇到记录为空情况

在正常解析一个有值的字符串时,用lateral view explode是完全ok的,但是,当遇到该字符串为空时,如果在使用该函数,就会导致该条记录消失。这时候需要加个outer lateral view outer explode




转载自https://blog.csdn.net/jarry_cm/article/details/90402833

之前小白有写过一篇文章是高效的解析字符串,里面讲到过一个方法:lateral view explode

最近小白发现,这个函数在使用时,还是有一些坑的,这里小白做一个总结。

在正常解析一个有值的字符串时,用lateral view explode是完全ok的,但是,当遇到该字符串为空时,如果在使用该函数,就会导致该条记录消失。具体场景如下:

sid filterlist
46 NULL

这时,用lateral view explode解析:

select a.sid
	   ,b.filtertype --筛选类型
  	   ,b.filtername --筛选内容
  	   ,b.filtertitle --筛选子类型
  	   ,b.filtersubtype --来源:1搜索;2筛选;3url传参
  	   ,b.filterid --筛选id
from (select sid,filterlist
        from dw_htlbizdb.tmp_hotel_list_bottom01 
	  lateral view explode(split(filterlist,'\\;'))t as flist
     )a
lateral view json_tuple(flist,'filtername') b as
  filtername
  where sid = 49
  ;

结果如下:

sid filtername
无记录

这样的结果就会导致我们漏掉一部分用户的浏览信息,在统计浏览量时数据缺失,结果与实际偏小。

这时,就要用到lateral view outer explode

lateral view explode这个UDTF转换的Array为空的记录,自动被过滤掉了,

如果想要保留记录,需要加上outer关键字。

select a.sid
	   ,b.filtertype --筛选类型
  	   ,b.filtername --筛选内容
  	   ,b.filtertitle --筛选子类型
  	   ,b.filtersubtype --来源:1搜索;2筛选;3url传参
  	   ,b.filterid --筛选id
from (select sid,filterlist
        from dw_htlbizdb.tmp_hotel_list_bottom01 
	  lateral view outer explode(split(filterlist,'\\;'))t as flist
     )a
lateral view json_tuple(flist,'filtername') b as
  filtername
  where sid = 49
  ;

结果为:

sid filtername
46 NULL

这才是最真实的浏览记录。大家在使用时,也要注意哦~

你可能感兴趣的:(Hive,lateral,view,explode)