背景:加入现在有这样的数据,可能一条ocr代表两个label,并且label通过","分隔。我们想把数据转换成下面的。
原始数据:
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函数,刚好借这题说说lateral view 与 explode函数的使用。
题目是这样:
原数据表如下图
需求:将电影分类中的数组数据展开。
结果如下:
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《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的功能示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。