Bootstrap

Hive SQL中的lateral view explode使用记录

1. explode函数

先说一说explode函数吧。

Explode()函数是Hive的内置函数,也有人将其称为炸裂函数,此函数将array或map作为输入,按行输出array或map中的元素,可搭配lateral view使用。

举两个简单例子。

select(explode(array('1','2','3'))) 

 

当explode函数的输入是array时,array中的每个元素都单独输出为一行。

select explode(map('A','1','B','2','C','3'))

explode函数的输入是map时,map中的每对key-value会单独输出为一行,key为一列,value为一列。

 

explode函数的输入只能为array或map,那explode就无法处理string了吗?必然不是!

遇到string的时候别忘了split()函数split函数可以将string按照规定符号进行划分,划分结果是array,这样经过划分string变成array,就能当做explode函数的输入了,完美解决!

select explode(split('1,2,3',','))

2. lateral view

举个例子,现在有这么一张表A,是用户的订单信息表,包括用户id、用户等级、订单信息,长这样:

还有另外一张表B里面是ordr_id及其对应的信息,长这样:

 

现在需要给A表中的订单挂是否异常的tag,怎么做?

直接需求就是将A中的ordr_set拆分,一行变多行,然后再跟B表join,此时要拆分A表,就想到了explode函数的一行变多行功能,但只有explode函数还不够,只能实现将ordr_set中的ordr_id拆成多行,却不允许直接与user_id、user_layer相连。

也就是用如下语句会报错,因为explode函数的使用存在某些限制,不允许在select中出现其他表达式

select user_id 
      ,user_layer
      ,explode(ordr_set) as ordr_id 
from A  -- 报错 不可这样写

此时explode便需要lateral view来拯救!帮助它解除限制!

Lateral view通常与生成器函数结合使用,比如explode,生成包含一行或多行的虚拟表。

select user_id -- 原字段
      ,user_layer -- 原字段
      ,ordr_id -- 拆分字段
from A
lateral view explode(ordr_set) tmp1 as ordr_id

使用lateral view explode就可以实现ordr_set中的ordr_id与相应的user_id、user_layer多行拆分了,其中tmp1是虚拟表的表名,ordr_id是ordr_set拆分后的字段。

使用lateral view的时候需要注意的几点:

1. lateral view的位置是from后where条件前;

2. 生成的虚拟表的表名不可省略;

3. from后可带多个lateral view;

4. 如果要拆分的字段有null值,需要使用lateral view outer 替代,避免数据缺失,这个坑我在工作中踩过!

;