python 实现 hive中类似 lateral view explode的功能示例
作者:数据拾光者 发布时间:2021-08-20 13:51:45
背景:加入现在有这样的数据,可能一条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函数的使用。
题目是这样:
原数据表如下图
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笛卡尔积关联,也可以多重使用。那么问题就这样解决了。
来源:https://blog.csdn.net/abc50319/article/details/103258955


猜你喜欢
- 最近做一个车牌识别项目,入门级别的,十分简单。车牌识别总体分成两个大的步骤:一、车牌定位:从照片中圈出车牌二、车牌字符识别这里只说第二个步骤
- 有时在我们注册账户、登陆系统时,当所有验证通过方可提交 这就需要Jquery来实现表单验证,今天分享给小伙伴们一段基于Jquery实现表单验
- 1 The syntax of the SQL statement is verified.SQL的语法检查2 The data dicti
- 作为主题的制作者, 除了实现功能, 展示界面, 还有责任使主题灵活多变, 以满足更多人不同的需求.可能一些朋友曾为选用双栏主题 (单侧边栏)
- Oracle分页查询的实例详解1.Oracle分页查询:SELECT * FROM ( SELECT A.*, ROWNUM RN FROM
- 在通过拼组sql语句来实现数据插入的应用中,我们很有可能会遇到需要插入大型数据的情况,例如,在oracle中需要插入字节数超过4000的字段
- 大家都知道Python运行速度很慢,但是轮子多,因此用户十分广泛,在各种领域上都能用到Python,但是最头疼的还是,解决运行速度问题,因此
- 在上一讲中已经连接了数据库。就数据库而言,连接之后就要对其操作。但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作
- 前言LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的。可以使用LogEntry模块记录所有用户的操作记录。一方面可以
- 一、什么是事务?数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。二、事务的四大属性分别是原
- 一、介绍vue.js 是 目前 最火的前端框架,vue.js 兼具 angular.js 和 react.js 的优点,并剔除它们的缺点,并
- 1. python中数字组成的列表转化为字符串或者一串数字f=[1,2,3,4]num=len(f)m='' #
- 本文实例为大家分享了python批量转换图片为黑白的具体代码,供大家参考,具体内容如下用到的库:OpenCV、osimport cv2imp
- 一、什么是"非构造函数"的继承?比如,现在有一个对象,叫做"中国人"。var Chinese = {
- Python与Perl,C和Java语言等有许多相似之处。不过,也有语言之间有一些明确的区别。本章的目的是让你迅速学习Python的语法。第
- 前言这篇文章主要给大家总结了关于学习Python的新手们容易犯的几个错误,一共四个易犯错误,下面来看看详细的介绍吧。一、i+=1 不等于++
- 环境:python3 + unittest + requestsExcel管理测试用例,HTMLTestRunner生成测试报告测试完成后邮
- 一、问题描述当用JS调用form的方法submit直接提交form的时候,submit事件不响应。为什么?知道的请回复。类比一下,我用inp
- 我们都知道 Python 中else的基本用法是在条件控制语句中的 if...elif...else...,但是 else 还有两个其它的用
- logging分为4个模块: loggers, handlers, filters, and formatters.●loggers: 提供