背景:加入现在有这样的数据,可能一条ocr代表两个label,并且label通过","分隔。我们想把数据转换成下面的。
原始数据:
label | ocr |
日常行车服务,汽车资讯 | 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 |
社会民生 | 已致2死20伤 !景区突遭尘卷风袭击,孩子被卷上天!现场画面曝光 |
目标数据:
label | ocr |
日常行车服务 | 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 |
汽车资讯 | 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 |
社会民生 | 已致2死20伤 !景区突遭尘卷风袭击,孩子被卷上天!现场画面曝光 |
实现办法:
1.通过hive代码:
1
2
3
4
5
6
7
|
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代码:
1
2
3
4
5
6
7
8
9
|
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函数,刚好借这题说说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结构的字段,使用案例如下:
1
2
3
4
5
6
7
8
9
|
/ / 建表语句
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一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
1
2
3
|
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的功能示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/abc50319/article/details/103258955