当前位置:   article > 正文

Hive--11---函数-----split() 、lateral view 、explode() 、posexplode()_hive split

hive split

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


split()

  • split()函数是用于切分数据,也就是将一串字符串切割成了一个数组

语法

split(str,regex)

  • 支持正则切分
  • 对于 “.”,"|“这样的特殊字符,不加”\“的时候是特殊字符,加了以后才是普通字符,
  • 而对于”\d"的字符,需要加"\“后才是特殊字符,就是是说”\d"才是匹配数字。

案例1:

在这里插入图片描述
用split()函数对name字段切分

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

在这里插入图片描述

案例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
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

案例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
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

综合案例

在这里插入图片描述

1. 单列Explode

首先来看下最基本的,我们如何把student这一列中的数据由一行变成多行。
这里需要使用split和explode,并结合lateral view实现。代码如下:

select
 class,student_name
from
default.classinfo
lateral view explode(split(student,',')) t as student_name
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

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
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
好像是不太行,如果我们分别对两列进行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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果符合我们预期:
在这里插入图片描述

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

闽ICP备14008679号