split、explode、lateral view用法和区别

  • split() 函数
  • explode() 函数
  • lateral view
  • lateral view outer
  • 小结


split() 函数

是用于切分数据,就是将一串字符串,按照指定格式切割成了一个数组,标准格式为split(str,regex),支持正则切分

对于 .| 这样的特殊字符,不加\转义符的时候是特殊字符,加了以后才是普通字符,而对于\d的字符,需要加\后才是特殊字符,就是是说\\d才是匹配数字。

有一张表(demo)如下:

hive split多个字符 hive的split函数_hive


split()函数对name字段切分

select 
	split(name,',') as name,
	age 
from 
	demo;

结果如下,返回值是一个array数组

hive split多个字符 hive的split函数_lateral view_02

explode() 函数

用于打散行的函数(将一行的数据拆分成多行,它的参数必须是map或array类型)。这个函数常和split()并用

select 
	explode(split(name,',')) as name 
from 
	demo;

上述sql代码表示将name字段按 , 分割,再将得到的数组利用explode()打散成多行

hive split多个字符 hive的split函数_hive split多个字符_03


上面这各视图我们只能看到name列,如果我写成

select 
	explode(split(name,',')) as name,
	age
from 
	demo;

是不是就可以得到nameage两列了呢。

事实是hive不支持这样的操作,会报错

hive split多个字符 hive的split函数_hive split多个字符_04


一个select后面只能获得一个explode()产生的视图,如果要显示多个列,则需要将多个视图合并。

lateral view

就是专门对拆分后的数据进行聚合的

如下(将name列打散,age列不打散)

select 
	rename,
	age 
from 
	demo 
	lateral view explode(split(name,',')) temp as rename;
	-- 命名成rename这样这句话好理解一点,不会和原来的name列搞混

hive split多个字符 hive的split函数_hive_05

如果将nameage同时打散合并

select 
	name,
	age 
from 
	demo 
	lateral view explode(split(name,',')) temp as name
	lateral view explode(split(age,',')) temp as age;

hive split多个字符 hive的split函数_hive split多个字符_06


可以看见,这时候两个later view合并,实际上是做了一个全连接。如果要一一对应可能只能自己写函数了。

lateral view outer

UDTF未产生行时,连接结果为空,如果想输入的行也输出,需要加上Outer关键字

# 未加Outer关键字,输出内容为空
select 
  name,
  course,
  col1
from lateral_test
lateral view explode(array()) temp as col1;
 
+-------+---------+-------+
| name  | course  | col1  |
+-------+---------+-------+
+-------+---------+-------+
 
# 加上Outer关键字,输出不为空
select 
  name,
  course,
  col1
from lateral_test
lateral view outer explode(array()) temp as col1;
 
+---------+-----------+-------+
|  name   |  course   | col1  |
+---------+-----------+-------+
| wadeyu  | c1,c2,c3  | NULL  |
| tom     | c2,c3,c5  | NULL  |
| polly   | c1,c2,c3  | NULL  |
+---------+-----------+-------+

小结

lateral view用于和split(), explode()、等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表

explode():
作用:是将一行数据转成多行数据(列转行),只能用于array和map类型的数据。
局限性:不能关联原有的表中的其他字段,不能和udtf嵌套使用

lateral view:
作用:为原始表的每行调用udtf,udtf会把一行数据拆分为多行,lateral view再把结果组合,产生一个支持别名的虚拟表,这样就解决了explode不能关联原有表其他字段的问题