Hive split()、explode()和lateral view 应用单列,多列炸裂

本文介绍了Hive中split、explode和lateral view的功能与用法,通过示例展示了如何利用这些函数进行列转行的操作。split根据分隔符拆分字符串为数组,explode将数组或Map拆分为多行,lateral view则用于配合UDTF生成多行数据。文中还解释了Hive的UDF、UDAF和UDTF的区别,并给出了多列数据炸裂的查询示例。
摘要由CSDN通过智能技术生成

基本概念

在对于SQL的使用中,常常会遇到列转行,或者将一列的数据散列成多行进行统计分析处理的需求,这时候,结合split()、explode()和lateral view 处理这些需求会使得我们得心应手许多。先来了解一下这三个基本的介绍吧。

  • 1.Split(str, separator):将字符串按照后面的分隔符切割,转换成字符array。第一个参数是我们需要进行分割的字符串,第二个参数是我们的分割符,其结果时一个数组。和Java中String的split()方法表现一致。
  • 2.EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。col可以是Hive中集合数据类型中的Array或Map,不能是struct类型。有小可爱还不清楚Hive的集合数据类型?那就贴心的带小可爱简单回顾一下。

Hive集合数据类型

数据类型 描述 语法示例
struct 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过 字段名.first来引用。 struct<street:string, city:string>
map MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map(‘first’,‘JOIN’,‘last’,‘Doe’)
ARRAY 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 Array() 例如array(‘john’,‘Doe’)

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

  • 3.LATERAL VIEW
    •   用法:LATERAL VIEW udtf(expression) 虚拟表别名 AS 列别名
      
    • lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
      lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。
    • tips :Hive的函数大致可以分为三类:UDF(用户自定义函数)、UDAF(用户自定义聚合函数)、UDTF(用户自定义表生成函数)。大致的特定如下:
      • UDF:一进一出,即遗憾数据输入,一行数据输出,如:substring()
      • UDAF: 多进一出,多行数据输入,只有一个结果输出,如:sum()、count()等聚合函数
      • UDTF:一进多出,如现在explode(),可以将一行数据输出为多行结果

示例

在大致了解了split()、explode()和lateral view的介绍我们一一开始去看看是如何使用的。

数据准备

# 新建一个文本
[qingfeng@hadoop102 data]$vim movie.txt
# 数据如下,电影的分类以及语言
《疑犯追踪》	悬疑,动作,科幻,剧情	English,Chinese,Janpanese,Krease
《Lie to me》	悬疑,警匪,动作,心理,剧情	English,Chinese,Janpanese,Gernemic
《战狼2》	战争,动作,灾难	English,Chinese,Janpanese
-- 创建movie表
hive > create table movie(mname string,category string,language string) 
row format delimited fields terminated by '\t';
-- 加载数据
hive > load data local inpath "/home/qingfeng/data/movie.txt" into table movie;
-- 查看数据
hive > select * from movie;

INFO  : OK
+----------------+---------------------+-------------------------------------+
| movie.mname    |   movie.category    |            movie.language             |
+----------------+---------------------+-------------------------------------+
| 《疑犯追踪》       | 悬疑,动作,科幻,剧情     | English,Chinese,Janpanese,Krease    |
| 《Lie to me》     | 悬疑,警匪,动作,心理,剧情  | English,Chinese
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值