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的,但是,当遇到该字符串为空时,如果在使用该函数,就会导致该条记录消失。具体场景如下:

sidfilterlist
46NULL

这时,用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
  ;

结果如下:

sidfiltername
无记录

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

这时,就要用到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
  ;

结果为:

sidfiltername
46NULL

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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive SQL中,使用Lateral View可以将一个表的一列拆分成多行,以便进行更复杂的查询和分析。在Lateral View中,最常用的函数是posexplodeexplode。 在引用中的例子中,使用了Lateral View posexplode函数将id列按逗号分隔拆分成多行,同时生成了一个新的列single_id_index和single_id。 在引用中的例子中,使用了两次Lateral View posexplode函数和where子句进行筛选。首先,将id列按逗号分隔拆分成多行,并生成新的列single_id_index和single_id。然后,将tim列按逗号分隔拆分成多行,并生成新的列single_yim_index和single_tim。最后,使用where条件将single_id_index和single_yim_index相等的行筛选出来。 在引用中的例子中,使用了Lateral View explode函数将ordr_set表中的ordr_id列拆分成多行,并将每一行与相应的user_id和user_layer进行拆分。tmp1是虚拟表的表名,ordr_id是拆分后的字段。 因此,Lateral ViewHive SQL中是一种非常有用的函数,可以帮助我们处理包含多值的列,并进行更复杂的查询和分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Hive SQL中的 lateral viewexplode(列转行)以及行转列](https://blog.csdn.net/qq_42374697/article/details/115273726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Hive SQL中的lateral view explode](https://blog.csdn.net/weixin_38753213/article/details/115364880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值