hive函数--02---split() lateral view explode() posexplode()
Posted 高高for 循环
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive函数--02---split() lateral view explode() posexplode()相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
split()
- split()函数是用于切分数据,也就是将一串字符串切割成了一个数组
语法
split(str,regex)
- 支持正则切分
- 对于 “.”,"|“这样的特殊字符,不加”\\“的时候是特殊字符,加了以后才是普通字符,
- 而对于”\\d"的字符,需要加"\\“后才是特殊字符,就是是说”\\d"才是匹配数字。
案例1:
用split()函数对name字段切分
select split(name,',') as name,age from demo;
案例2:
案例3:
explode()
概念
explode()用于将hive一列中复杂的array或者map结构拆分成多行
- 如果你传递的参数是Array, 会给这个Array分隔转成多行 ,
- 如果你传递的是Map,就会给Map里面的每个元素分隔成多行和多列.
- 参数只能是Array或者是Map
explode函数属于udtf,udtf在使用时候,不能和其它表达式一起出现在select子句后,言外之意只能单独出现在select子句中.
案例 1
将array当中的数据拆分开
将map当中的数据拆分开
LATERAL VIEW
- 一个select后面只能获得一个explode产生的视图,如果要显示多个列,则需要将多个视图合并。lateral view就是做这样的事的
- lateral view 侧视图。原表的每一行和explode_lateral_view进行笛卡尔积关联,也可以多重使用
案例1
首先来看下最基本的,我们如何把student这一列中的数据由一行变成多行。
这里需要使用split和explode,并结合lateral view实现。代码如下:
select
class,student_name
from
default.classinfo
lateral view explode(split(student,',')) t as student_name
案例2
- Lateral View 用于和UDTF函数【explode,split】结合来使用。
- 首先通过UDTF函数将数据拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
- 主要解决在select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。
- 语法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)
使用LATERAL VIEW + explode 函数进行查询
select movie, category_name
from movie_info
LATERAL VIEW explode(category) tmpTable as category_name;
综合案例
1. 单列Explode
首先来看下最基本的,我们如何把student这一列中的数据由一行变成多行。
这里需要使用split和explode,并结合lateral view实现。代码如下:
select
class,student_name
from
default.classinfo
lateral view explode(split(student,',')) t as student_name
2. 单列Posexplode
- 接下来,我们想要给每个同学来一个编号,假设编号就按姓名的顺序,此时我们要用到另一个hive函数,叫做posexplode,代码如下:
select
class,student_index + 1 as student_index,student_name
from
default.classinfo
lateral view posexplode(split(student,',')) t as student_index,student_name
3. 多列Explode 结合 lateral view
- 好了,我们继续前进。这次我们想基于两列explode,同时能够使学生和其成绩能够匹配
- 显然我们要对两列进行explode,先试试行不行:
select
class,student_name,student_score
from
default.classinfo
lateral view explode(split(student,',')) sn as student_name
lateral view explode(split(score,',')) sc as student_score
好像是不太行,如果我们分别对两列进行explode的话,假设每列都有三个值,那么最终会变成3 * 3 = 9行。但我们想要的结果只有三行。
lateral view 侧视图。原表的每一行和explode_lateral_view进行笛卡尔积关联,也可以多重使用
4. 改进方法
此时我们可以进行两次posexplode,姓名和成绩都保留对应的序号,即使变成了9行,我们通过where条件只保留序号相同的行即可。代码如下:
select
class,student_name,student_score
from
default.classinfo
lateral view posexplode(split(student,',')) sn as student_index_sn,student_name
lateral view posexplode(split(score,',')) sc as student_index_sc,student_score
where
student_index_sn = student_index_sc
5. 窗口函数 rank() 进行排名
- 假设我们又想对同学的成绩进行一下排名该怎么做呢?当然是借助rank函数啦
(row_number函数对于相同的成绩也会赋予不同的排名,所以我们选择rank函数
select
class,
student_name,
student_score,
rank() over(partition by class order by student_score desc) as student_rank
from
default.classinfo
lateral view posexplode(split(student,',')) sn as student_index_sn,student_name
lateral view posexplode(split(score,',')) sc as student_index_sc,student_score
where
student_index_sn = student_index_sc
结果符合我们预期:
以上是关于hive函数--02---split() lateral view explode() posexplode()的主要内容,如果未能解决你的问题,请参考以下文章