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




  1. Lateral View 用于和UDTF函数【explode,split】结合来使用。
  2. 首先通过UDTF函数将数据拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
  3. 主要解决在select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。
  4. 语法: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()的主要内容,如果未能解决你的问题,请参考以下文章

late_initcall 替换 module_init

使用 DataTempülate 创建可编辑的 GridviewColumn

hive udf 函数:MD5

如何写hive的udf函数

Hive脚本、Hive API、Hive 自定义函数

查询hive中都有哪些自定义函数