赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
split(str,regex)
用split()函数对name字段切分
select split(name,',') as name,age from demo;
explode()用于将hive一列中复杂的array或者map结构拆分成多行
explode函数属于udtf,udtf在使用时候,不能和其它表达式一起出现在select子句后,言外之意只能单独出现在select子句中.
将array当中的数据拆分开
将map当中的数据拆分开
首先来看下最基本的,我们如何把student这一列中的数据由一行变成多行。
这里需要使用split和explode,并结合lateral view实现。代码如下:
select
class,student_name
from
default.classinfo
lateral view explode(split(student,',')) t as student_name
使用LATERAL VIEW + explode 函数进行查询
select movie, category_name
from movie_info
LATERAL VIEW explode(category) tmpTable as category_name;
首先来看下最基本的,我们如何把student这一列中的数据由一行变成多行。
这里需要使用split和explode,并结合lateral view实现。代码如下:
select
class,student_name
from
default.classinfo
lateral view explode(split(student,',')) t as student_name
select
class,student_index + 1 as student_index,student_name
from
default.classinfo
lateral view posexplode(split(student,',')) t as student_index,student_name
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进行笛卡尔积关联,也可以多重使用
此时我们可以进行两次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
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
结果符合我们预期:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。