需求:
《疑犯》 悬疑,动作,科幻,爱情
《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)详解相关推荐

  1. Hive Lateral View + explode 详解

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

  2. hive/mysql使用lateral view explode时会出现的问题(bug)

    hive/mysql使用lateral view explode时会出现的问题 例子 两边计算的区别 问题说明 例子 两边计算的区别 上面两边代码除了右边对disp_detail和clk_detail ...

  3. hive sql之lateral view explode用法

    这篇文章讲的特别好 lateral view explode相当于笛卡尔乘积: 表1的每一行与表二的每一行组合,作为新的一行

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

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

  5. hive lateral view explode列拆分与行转列用法

    在日常工作中,我们在处理数据时,会遇到某个列存在多个数据的情况,如果想拿到这个列里面每个数据进行后续处理的话,这种情况下有两种处理方式: 第一种:如果这个列多个数据是固定数目,可以使用split切分 ...

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

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

  7. Hive Lateral View explode字段值为空时,导致数据异常丢失解决方案

    1.问题描述 日常工作中,我们经常会用Lateral View 结合explode把非结构化数据转化成结构化数据,但是该方法对应explode的内容是有非null限制的,否则就有可能造成数据缺失. 现 ...

  8. Hive 连续多次 lateral view explode 踩坑

    table1表结构: c1 c2arr c3arr c4arr select c1, c2arr_item, c3arr_item, c4arr_item from table1 lateral vi ...

  9. hive中的 lateral view

    lateral view用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合. 一个简单的例子,假设我们有一张表pageAds,它有 ...

最新文章

  1. ARTS打卡计划第二周-Share-使用java注解对方法计时
  2. 说说计算机发展史在你的印象里都有哪些内容,鱼池宣讲 | 专题采访 第二期 | 过去的一年里,你印象深刻的事情有哪些?...
  3. ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
  4. FGPM:文本对抗样本生成新方法
  5. java nutz_jnutz: 基于nutz的java+js混合开发项目
  6. 我对一个js问题的分析
  7. leetcode 1223 python
  8. 如何将常用的软件上传到ESXi本地存储中管理
  9. 使用PHPExcel实现Excel文件的导入和导出(模板导出)
  10. PDE2 three fundamental examples
  11. 码支付(php版本)应用
  12. 年终总结:2021年最有用的数据清洗 Python 库
  13. 关于HTML中常用选择器
  14. 订单薄与发现冰山订单
  15. 荣耀全家桶框架插件(关联P30pro、Mate20、荣耀20pro等)
  16. 教程 | 使用小O地图制作文字标注地图
  17. 大学期间能考的计算机证书,大学期间可以考的证书,含金量,很有用
  18. 简单的自动化测试模型(python+selenium)
  19. configure it with blueman-service
  20. nodejs的package.json配置参数

热门文章

  1. table单元格合并
  2. 我国推进大数据综合试验区建设 辐射带动经济提质增效
  3. 《Hadoop MapReduce实战手册》一2.8 使用HDFS的Java API
  4. html5解决大文件断点续传6,解决html5大文件断点续传
  5. 联想如何助80后公益创业?
  6. 【源码分享】微服务快速开发平台:基于 SpringCloud + SpringBoot 开发,具备SaaS模式切换
  7. WP Super Cache 安装后无法使用
  8. LattePanda Delta拿铁熊猫开发板安装SSD及刷多系统
  9. 哈呀呀 怎么样呢?有知道的朋友说一下吧!
  10. 七段数码管绘制和科赫雪花绘制