split、explode、lateral view用法和区别
- split() 函数
- explode() 函数
- lateral view
- lateral view outer
- 小结
split() 函数
是用于切分数据,就是将一串字符串,按照指定格式切割成了一个数组,标准格式为split(str,regex)
,支持正则切分
对于 .
,|
这样的特殊字符,不加\
转义符的时候是特殊字符,加了以后才是普通字符,而对于\d
的字符,需要加\
后才是特殊字符,就是是说\\d
才是匹配数字。
有一张表(demo)如下:
用split()
函数对name字段切分
select
split(name,',') as name,
age
from
demo;
结果如下,返回值是一个array数组
explode() 函数
用于打散行的函数(将一行的数据拆分成多行,它的参数必须是map或array类型
)。这个函数常和split()
并用
select
explode(split(name,',')) as name
from
demo;
上述sql代码表示将name字段按 ,
分割,再将得到的数组利用explode()
打散成多行
上面这各视图我们只能看到name列,如果我写成
select
explode(split(name,',')) as name,
age
from
demo;
是不是就可以得到name
,age
两列了呢。
事实是hive不支持这样的操作,会报错
一个select
后面只能获得一个explode()
产生的视图,如果要显示多个列,则需要将多个视图合并。
lateral view
就是专门对拆分后的数据进行聚合的
如下(将name列打散,age列不打散)
select
rename,
age
from
demo
lateral view explode(split(name,',')) temp as rename;
-- 命名成rename这样这句话好理解一点,不会和原来的name列搞混
如果将name
,age
同时打散合并
select
name,
age
from
demo
lateral view explode(split(name,',')) temp as name
lateral view explode(split(age,',')) temp as age;
可以看见,这时候两个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不能关联原有表其他字段的问题