当前位置:   article > 正文

【Hive】split()、explode()、lateral view用法和区别_lateral view split

lateral view split

split() 函数

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

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

有一张表(demo)如下:
在这里插入图片描述
split()函数对name字段切分

select 
	split(name,',') as name,
	age 
from 
	demo;
  • 1
  • 2
  • 3
  • 4
  • 5

结果如下,返回值是一个array数组
在这里插入图片描述

explode() 函数

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

select 
	explode(split(name,',')) as name 
from 
	demo;
  • 1
  • 2
  • 3
  • 4

上述sql代码表示将name字段按 , 分割,再将得到的数组利用explode()打散成多行
在这里插入图片描述
上面这各视图我们只能看到name列,如果我写成

select 
	explode(split(name,',')) as name,
	age
from 
	demo;
  • 1
  • 2
  • 3
  • 4
  • 5

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

事实是hive不支持这样的操作,会报错
在这里插入图片描述
一个select后面只能获得一个explode()产生的视图,如果要显示多个列,则需要将多个视图合并。

lateral view

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

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

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

在这里插入图片描述

如果将nameage同时打散合并

select 
	name,
	age 
from 
	demo 
	lateral view explode(split(name,',')) temp as name
	lateral view explode(split(age,',')) temp as age;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
可以看见,这时候两个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  |
+---------+-----------+-------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

小结

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/656426
推荐阅读
相关标签
  

闽ICP备14008679号