导航

  • 基本概念
  • 示例
    • 数据准备
    • 函数应用
      • split()
      • explode()函数
  • 总结

基本概念

在对于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,Janpanese,Gernemic  |
| 《战狼2》         | 战争,动作,灾难        | English,Chinese,Janpanese           |
+----------------+---------------------+-------------------------------------+
3 rows selected (0.087 seconds)

函数应用

split()

使用split函数,其结果为array数组,将分割的元素放在数组中。

-- split()
hive> select split(category,',') cate from movie;
+-----------------------------+
|            cate             |
+-----------------------------+
| ["悬疑","动作","科幻","剧情"]       |
| ["悬疑","警匪","动作","心理","剧情"]  |
| ["战争","动作","灾难"]            |
+-----------------------------+
3 rows selected (0.1 seconds)

explode()函数

使用explode()函数在split基础上对电影分类的这一列转换为多行单个

hive > select explode(split(category,',')) from movie;
+------+
| col  |
+------+
| 悬疑   |
| 动作   |
| 科幻   |
| 剧情   |
| 悬疑   |
| 警匪   |
| 动作   |
| 心理   |
| 剧情   |
| 战争   |
| 动作   |
| 灾难   |
+------+
12 rows selected (0.075 seconds)

当我们需要将电影名称和对应的分类对应显示,我们应该怎么做?
结果形如:

《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难

我们在explode查询基础上添加mname字段,是否可以呢?

hive> select mname,explode(split(category,',')) cate from movie;
Error: Error while compiling statement: FAILED: SemanticException [Error 10081]:
UDTF's are not supported outside the SELECT clause,nor nested in expressions (state=42000,code=10081)

报错了,提示我们不支持在select外部使用UDTF函数,这个时候lateral view就可以配合一起使用了,lateral view我们也称之为侧写。

-- 结合lateral view 查看
select mname,cate
from movie
lateral view explode(split(category,',')) tmp as cate;+--------------+-------+
|    mname     | cate  |
+--------------+-------+
| 《疑犯追踪》       | 悬疑    |
| 《疑犯追踪》       | 动作    |
| 《疑犯追踪》       | 科幻    |
| 《疑犯追踪》       | 剧情    |
| 《Lie to me》  | 悬疑    |
| 《Lie to me》  | 警匪    |
| 《Lie to me》  | 动作    |
| 《Lie to me》  | 心理    |
| 《Lie to me》  | 剧情    |
| 《战狼2》        | 战争    |
| 《战狼2》        | 动作    |
| 《战狼2》        | 灾难    |
+--------------+-------+
12 rows selected (0.047 seconds)

当我们需要对于category 列和language列一起散列,只需要对每一个需要操作的列进行lateral view即可。
需求是想要如下的显示格式:

+--------------+-------+------------+
|    mname     | cate  |    lang    |
+--------------+-------+------------+
| 《疑犯追踪》       | 悬疑    | English    |
| 《疑犯追踪》       | 悬疑    | Chinese    |
| 《疑犯追踪》       | 悬疑    | Janpanese  |
| 《疑犯追踪》       | 悬疑    | Krease     |
| 《疑犯追踪》       | 动作    | English    |
| 《疑犯追踪》       | 动作    | Chinese    |
| 《疑犯追踪》       | 动作    | Janpanese  |
| 《疑犯追踪》       | 动作    | Krease     |
| 《疑犯追踪》       | 科幻    | English    |
| 《疑犯追踪》       | 科幻    | Chinese    |
| 《疑犯追踪》       | 科幻    | Janpanese  |
| 《疑犯追踪》       | 科幻    | Krease     |
| 《疑犯追踪》       | 剧情    | English    |
| 《疑犯追踪》       | 剧情    | Chinese    |
| 《疑犯追踪》       | 剧情    | Janpanese  |
| 《疑犯追踪》       | 剧情    | Krease     |
| 《Lie to me》  | 悬疑    | English    |

则其对应的查询sql如下:

hive> select mname,cate,lang from movie lateral view explode(split(category,',')) tmp as cate lateral view explode(split(language,','))  tmp as lang;+--------------+-------+------------+
|    mname     | cate  |  lang      |
+--------------+-------+------------+
| 《疑犯追踪》       | 悬疑    | English    |
| 《疑犯追踪》       | 悬疑    | Chinese    |
| 《疑犯追踪》       | 悬疑    | Janpanese  |
| 《疑犯追踪》       | 悬疑    | Krease     |
| 《疑犯追踪》       | 动作    | English    |
| 《疑犯追踪》       | 动作    | Chinese    |
| 《疑犯追踪》       | 动作    | Janpanese  |
| 《疑犯追踪》       | 动作    | Krease     |
| 《疑犯追踪》       | 科幻    | English    |
| 《疑犯追踪》       | 科幻    | Chinese    |
| 《疑犯追踪》       | 科幻    | Janpanese  |
| 《疑犯追踪》       | 科幻    | Krease     |
| 《疑犯追踪》       | 剧情    | English    |
| 《疑犯追踪》       | 剧情    | Chinese    |
| 《疑犯追踪》       | 剧情    | Janpanese  |
| 《疑犯追踪》       | 剧情    | Krease     |
| 《Lie to me》  | 悬疑    | English    |
| 《Lie to me》  | 悬疑    | Chinese    |
| 《Lie to me》  | 悬疑    | Janpanese  |
| 《Lie to me》  | 悬疑    | Gernemic   |
| 《Lie to me》  | 警匪    | English    |
| 《Lie to me》  | 警匪    | Chinese    |
| 《Lie to me》  | 警匪    | Janpanese  |
| 《Lie to me》  | 警匪    | Gernemic   |
| 《Lie to me》  | 动作    | English    |
| 《Lie to me》  | 动作    | Chinese    |
| 《Lie to me》  | 动作    | Janpanese  |
| 《Lie to me》  | 动作    | Gernemic   |
| 《Lie to me》  | 心理    | English    |
| 《Lie to me》  | 心理    | Chinese    |
| 《Lie to me》  | 心理    | Janpanese  |
| 《Lie to me》  | 心理    | Gernemic   |
| 《Lie to me》  | 剧情    | English    |
| 《Lie to me》  | 剧情    | Chinese    |
| 《Lie to me》  | 剧情    | Janpanese  |
| 《Lie to me》  | 剧情    | Gernemic   |
| 《战狼2》        | 战争    | English    |
| 《战狼2》        | 战争    | Chinese    |
| 《战狼2》        | 战争    | Janpanese  |
| 《战狼2》        | 动作    | English    |
| 《战狼2》        | 动作    | Chinese    |
| 《战狼2》        | 动作    | Janpanese  |
| 《战狼2》        | 灾难    | English    |
| 《战狼2》        | 灾难    | Chinese    |
| 《战狼2》        | 灾难    | Janpanese  |
+--------------+-------+------------+
45 rows selected (0.052 seconds)

从结果可以看出,多个列进行lateral view就是各自的explode做了全连接。

总结

explode函数一般是与lateral view结合使用,因为我们在实际业务中不会单独查看一个列散列之后的情况。同时也从多列explode可以看出,多列的结果是各个列的全连接。

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

  1. explode与lateral view解析 hive

    工作中看代码时遇到lateral view explode(split(sni_type,','))  snTable as sni_info ,初看挺一脸懵逼的,细查之后才明白是对字段sni_typ ...

  2. hive中split(),explode()和lateral row

    split()函数是用于切分数据,也就是将一串字符串切割成了一个数组,标准格式为split(str,regex),支持正则切分不过有点奇怪的是,对于 ".","|&quo ...

  3. Hive列转行 (Lateral View + explode)详解

    需求: <疑犯> 悬疑,动作,科幻,爱情 <lies> 悬疑,警匪,动作,心理,剧情 <战狼> 战争,动作,灾难转成如下格式:<疑犯> 悬疑 <疑 ...

  4. mysql explode函数_hive中,lateral view 与 explode函数

    hive中常规处理json数据,array类型json用get_json_object(#,"$.#")这个方法足够了,map类型复合型json就需要通过数据处理才能解析. exp ...

  5. Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

    前言:在对表数据进行批量处理过程中,常常碰上某个字段是一个array或者map形式的字段,一列数据的该字段信息同时存在多个值,当我们需要取出该数组中的每一个值实现一一对应关系的时候,可以考虑使用lat ...

  6. Hive Lateral View + explode 详解

    hive中的函数分为3类,UDF函数.UDAF函数.UDTF函数 UDF:一进一出 UDAF:聚集函数,多进一出,类似于:count/max/min UDTF:一进多出,如explore().pose ...

  7. hive中的lateral view 与 explode函数的使用

    explode与lateral view在关系型数据库中本身是不该出现的,因为他的出现本身就是在操作不满足第一范式的数据(每个属性都不可再分), 本身已经违背了数据库的设计原理(不论是业务系统还是数据 ...

  8. hive explode函数入门及其与lateral view的结合

    简单用法 举个例子 select collect_list(name) from t_order; 结果 +---------------------------------------------- ...

  9. hive中的lateral view的解析

    hive中的lateral view的解析 用json存储的概率比较大,直接导入hive为基础的数仓系统中,就需要经过ETL过程解析这类数据,explode与lateral view在这种场景下大显身 ...

  10. Hive中lateral view的应用到源码解读

    对于从事大数据开发的同学,经常会应用到explode(炸裂函数)和lateral view(侧输出流). Explode(炸裂函数) 参数必须是array或者map格式(通常跟split函数使用): ...

最新文章

  1. 设置Nginx开机自动启动(centos6.8上亲测可用)
  2. 甲骨文 93 亿美元现金收购云计算商 NetSuite
  3. MySQL 5.7.17 VS MariaDB 10.1.19 Enterprise性能压测
  4. Python基础(三):字符串和元组常用方法
  5. 【代码示例】 一个简单的Java死锁
  6. educoder 使用线程锁(lock)实现线程同步_Python并行编程(二):多线程锁机制利用Lock与RLock实现线程同步
  7. 关于Increased rates of convergence through learning rate adaptation一文的理解
  8. Python这么热,要不要追赶Python学习热潮?
  9. GlusterFS架构与维护
  10. Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案
  11. 完整的python项目实例-《Python爬虫开发与项目实战》pdf完整版
  12. MDM数据清洗功能开发说明
  13. 2017年第八届蓝桥杯真题解析JavaB组
  14. Java第32课——求数组元素最大值
  15. 前端页面缓存系列之localStorage
  16. [jruby] warbler 配置问题说明
  17. Windows 10系统下Outlook日历怎么显示农历?
  18. 【人工智能学习笔记】初识人工智能
  19. 人脸识别通过什么区分人脸和照片
  20. 关于windows10升级

热门文章

  1. 知识服务才是为用户创造价值的体现
  2. 微信公共号开发教程java版——基础知识和环境搭建(一)
  3. 神奇的识别图片文字代码
  4. swiper使用笔记-禁止某个div或slide左右切换
  5. python各城市对应的省_python实现城市和省份字典(根据城市判断属于哪个省份)...
  6. KeilC51使用详解 (三)
  7. 一元函数积分学之3__绝对值函数的定积分的解法
  8. 各场景下NetApp的数据备份推荐(Veeam+群晖NAS)
  9. 今天的两个收获--linux的特性和海森堡式错误
  10. 灵飞经5龙生九子 第二十一章 危机四伏 3