Python实现Hive中Lateral View Explode功能的示例
本文介绍如何在Python中实现Hive中类似lateral view explode的功能,将包含多个标签的字符串拆分为多行数据。通过具体示例展示Hive SQL与Python代码的实现方式,并补充相关理论知识,帮助读者理解列转行的数据处理方法。
Python实现Hive中Lateral View Explode功能的示例
背景:假设当前存在如下数据,其中一条OCR识别结果可能对应多个标签,且这些标签通过逗号分隔。我们需要将这种数据转换为另一种格式。
原始数据如下:
| label | ocr |
| 日常行车服务,汽车资讯 | 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 |
| 社会民生 | 已致2死20伤 !景区突遭尘卷风袭击,孩子被卷上天!现场画面曝光 |
目标数据格式如下:
| label | ocr |
| 日常行车服务 | 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 |
| 汽车资讯 | 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 |
| 社会民生 | 已致2死20伤 !景区突遭尘卷风袭击,孩子被卷上天!现场画面曝光 |
实现方法:
1. 通过Hive代码实现:
select ocr,split(tag_info,',') label
from
(
select label,ocr
from t1
lateral view explode(split(label,',')) TableName as tag_info
) t;
需要注意的是,必须添加别名t以进行命名。
2. 通过Python代码实现:
df0 = pd.DataFrame({'A':[[1,2],[5,6]],'B':[10,-20]})
df0 = df
df0.columns = ['A','B']
rows = []
for i, row in df0.iterrows():
for a in row.A.split(","):
rows.append((a, row.B))
df222 = pd.DataFrame(rows, columns=df.columns)
df222
补充知识:Hive中lateral view(侧视图)与explode函数的使用
补充知识:Hive中lateral view(侧视图)与explode函数的使用
今天偶然发现了一个Hive中列转行的示例题目,需要用到lateral view和explode函数,借此机会讨论一下这两个函数的使用。
题目描述如下:
原始数据表结构如下图所示:
| movie | category |
|---|---|
| 《疑犯追踪》 | 悬疑,动作,科幻,剧情 |
| 《Lie to me》 | 悬疑,警匪,动作,心理,剧情 |
| 《战狼2》 | 战争,动作,灾难 |
需求:将电影分类中的数组数据展开。
结果如下所示:
《疑犯追踪》 悬疑 《疑犯追踪》 动作 《疑犯追踪》 科幻 《疑犯追踪》 剧情 《Lie to me》 悬疑 《Lie to me》 警匪
先简单聊几句理论:explode与lateral view在关系型数据库中本身是不该出现的,因为他的出现本身就是在操作不满足第一范式的数据(每个属性都不可再分),本身已经违背了数据库的设计原理(不论是业务系统还是数据仓库系统),不过大数据技术普及后,很多类似pv,uv的数据,在业务系统中是存贮在非关系型数据库中,用json存储的概率比较大,直接导入hive为基础的数仓系统中,就需要经过ETL过程解析这类数据,explode与lateral view在这种场景下大显身手。
explode作用是处理map结构的字段,使用案例如下:
//建表语句
create table movie_info(
movie string,
category array<string>
)
row format delimited fields terminated by '\t'
collection items terminated by ',';
//加载数据
load data local inpath '/opt/data/movie.txt' into table movie_info;
看下explode函数效果,以拆解category为例,可与原数据表结构对比。
select explode(category) from movie_info;

LATERAL VIEW的使用:
用法:
LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
select movie,category_name
from movie_info
lateral view explode(category) table_emp as category_name;
效果如下:

其中lateral view explode(category) table_emp相当于一个虚拟表,与原表movie_info笛卡尔积关联,也可以多重使用。那么问题就这样解决了。
以上这篇python 实现 hive中类似 lateral view explode的功能示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













