欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-12 17:30:14
...

在正常解析一个有值的字符串时,用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

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