Hive列转行 (Lateral View + explode)详解
需求:
《疑犯》 悬疑,动作,科幻,爱情
《lies》 悬疑,警匪,动作,心理,剧情
《战狼》 战争,动作,灾难转成如下格式:《疑犯》 悬疑
《疑犯》 动作
《疑犯》 科幻
《疑犯》 爱情
《lies》 悬疑
《lies》 警匪
《lies》 动作
《lies》 心理
《lies》 剧情
《战狼》 战争
《战狼》 动作
《战狼》 灾难
思路解析:
explode函数:处理map结构的字段,将数组转换成多行
step1:建表movie_info:
--对电影的风格使用数组,所以建表时要标明数组的分隔符语句 —— collection items terminated by ","
hive (felix)> create table split_explored_a (> id string,> item_array array<string>)> row format delimited> fields terminated by "\t"> collection items terminated by ",";[hadoop@hadoop1 ~]$ cat explored_test.txt
<疑犯> 悬疑,动作,科幻,爱情
<lies> 悬疑,警匪,动作,心理,剧情
<战狼> 战争,动作,灾难-- 插入数据
hive (felix)> load data local inpath '/home/hadoop/explored_test.txt' overwrite into table split_explored_a;
Loading data to table felix.split_explored_a
OK
Time taken: 0.62 seconds--查询表格:hive (felix)> select * from split_explored_a ;
OK
<疑犯> ["悬疑","动作","科幻","爱情"]
<lies> ["悬疑","警匪","动作","心理","剧情"]
<战狼> ["战争","动作","灾难"]
Time taken: 0.121 seconds, Fetched: 3 row(s)
hive (felix)>
此时可以看到category是一个数组,并且分隔符为",";
step2:explode的使用:
explode作用:处理map结构的字段,将数组转换成多行
所以我们现在先对category使用category函数:
hive (felix)> select explode(item_array) from split_explored_a;
OK
悬疑
动作
科幻
爱情
悬疑
警匪
动作
心理
剧情
战争
动作
灾难
Time taken: 0.355 seconds, Fetched: 12 row(s)
hive (felix)>
如果想要得到题目的需求结果,那么需要在此结果上,每一部电影和该电影对应的category进行笛卡尔积,得到结果:
如果我们直接
hive (felix)> select id,explode(item_array) from split_explored_a;
FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions
hive (felix)>
查询直接报错,因为movie的结果只有三条,而explode(category)有 4 + 5 + 3 = 12条记录。
那么,我们由此引入LATERAL VIEW函数:
LATERAL VIEW:
- 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 函数进行查询,语句如下:
hive (felix)> select id,item_name from split_explored_a > lateral view explode(item_array) tt as item_name; --item_name 为别名列
OK
<疑犯> 悬疑
<疑犯> 动作
<疑犯> 科幻
<疑犯> 爱情
<lies> 悬疑
<lies> 警匪
<lies> 动作
<lies> 心理
<lies> 剧情
<战狼> 战争
<战狼> 动作
<战狼> 灾难
Time taken: 0.044 seconds, Fetched: 12 row(s)
hive (felix)>
另一个经典例子【单列转多行】:
单列转多行
假设有数据表
col2row:col1 col2 col3
a b 1,2,3
c d 4,5,6现要将其转化为:col1 col2 col3
a b 1
a b 2
a b 3
c d 4
c d 5
c d 6这里需要使用UDTF(表生成函数)explode(),该函数接受array类型的参数,其作用恰好与collect_set相反,实现将array类型数据行转列。explode配合lateral view实现将某列数据拆分成多行。HQL语句为:select col1, col2, lv.col3 as col3
from col2row
lateral view explode(split(col3, ',')) lv as col3;col1 col2 col3
a b 1
a b 2
a b 3
c d 4
c d 5
c d 6
Hive列转行 (Lateral View + explode)详解相关推荐
- Hive Lateral View + explode 详解
hive中的函数分为3类,UDF函数.UDAF函数.UDTF函数 UDF:一进一出 UDAF:聚集函数,多进一出,类似于:count/max/min UDTF:一进多出,如explore().pose ...
- hive/mysql使用lateral view explode时会出现的问题(bug)
hive/mysql使用lateral view explode时会出现的问题 例子 两边计算的区别 问题说明 例子 两边计算的区别 上面两边代码除了右边对disp_detail和clk_detail ...
- hive sql之lateral view explode用法
这篇文章讲的特别好 lateral view explode相当于笛卡尔乘积: 表1的每一行与表二的每一行组合,作为新的一行
- Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数
前言:在对表数据进行批量处理过程中,常常碰上某个字段是一个array或者map形式的字段,一列数据的该字段信息同时存在多个值,当我们需要取出该数组中的每一个值实现一一对应关系的时候,可以考虑使用lat ...
- hive lateral view explode列拆分与行转列用法
在日常工作中,我们在处理数据时,会遇到某个列存在多个数据的情况,如果想拿到这个列里面每个数据进行后续处理的话,这种情况下有两种处理方式: 第一种:如果这个列多个数据是固定数目,可以使用split切分 ...
- hive中的lateral view 与 explode函数的使用
explode与lateral view在关系型数据库中本身是不该出现的,因为他的出现本身就是在操作不满足第一范式的数据(每个属性都不可再分), 本身已经违背了数据库的设计原理(不论是业务系统还是数据 ...
- Hive Lateral View explode字段值为空时,导致数据异常丢失解决方案
1.问题描述 日常工作中,我们经常会用Lateral View 结合explode把非结构化数据转化成结构化数据,但是该方法对应explode的内容是有非null限制的,否则就有可能造成数据缺失. 现 ...
- Hive 连续多次 lateral view explode 踩坑
table1表结构: c1 c2arr c3arr c4arr select c1, c2arr_item, c3arr_item, c4arr_item from table1 lateral vi ...
- hive中的 lateral view
lateral view用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合. 一个简单的例子,假设我们有一张表pageAds,它有 ...
最新文章
- ARTS打卡计划第二周-Share-使用java注解对方法计时
- 说说计算机发展史在你的印象里都有哪些内容,鱼池宣讲 | 专题采访 第二期 | 过去的一年里,你印象深刻的事情有哪些?...
- ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
- FGPM:文本对抗样本生成新方法
- java nutz_jnutz: 基于nutz的java+js混合开发项目
- 我对一个js问题的分析
- leetcode 1223 python
- 如何将常用的软件上传到ESXi本地存储中管理
- 使用PHPExcel实现Excel文件的导入和导出(模板导出)
- PDE2 three fundamental examples
- 码支付(php版本)应用
- 年终总结:2021年最有用的数据清洗 Python 库
- 关于HTML中常用选择器
- 订单薄与发现冰山订单
- 荣耀全家桶框架插件(关联P30pro、Mate20、荣耀20pro等)
- 教程 | 使用小O地图制作文字标注地图
- 大学期间能考的计算机证书,大学期间可以考的证书,含金量,很有用
- 简单的自动化测试模型(python+selenium)
- configure it with blueman-service
- nodejs的package.json配置参数