hive中将单行拆分成多行总结
hive中将单行拆分成多行
初始值:
id | name | mobiles |
---|---|---|
1 | jim | 139,177,158 |
想得到的结果:
id | name | mobiles |
---|---|---|
1 | jim | 139 |
1 | jim | 177 |
1 | jim | 158 |
创建测试数据
CREATE TABLE fwj.customer ( id STRING, name STRING, mobiles STRING); INSERT INTO fwj.customer SELECT '1','jim','139,177,158' FROM system.dual;
1.最笨的办法:
逻辑简单,写法粗暴,可拓展性为0。
SELECT a.id,a.name,substr(a.mobiles,1,3) mobiles FROM fwj.customer a UNION ALL SELECT a.id,a.name,substr(a.mobiles,5,3) mobiles FROM fwj.customer a UNION ALL SELECT a.id,a.name,substr(a.mobiles,9,3) mobiles FROM fwj.customer a result: id name mobiles 1 jim 139 1 jim 177 1 jim 158
2. 第二种方法
仔细看看这个mobiles字段,其实我们只要将这个字段中用逗号间隔的值拆开到每一列,然后再和原表关联就能得到我们想要的答案了。在oracle中有列传行,hive中也有类似的操作。
SELECT b.id,a.mobiles,b.name FROM ( SELECT explode(split(t.mobiles,',')) mobiles FROM fwj.customer t )a , fwj.customer b; result: id name mobiles 1 jim 139 1 jim 177 1 jim 158
这里会用到两个函数。
split(str,sep):
该函数的作用是拆分指定分隔符分割的字符串,返回一个列表。
如:
SELECT split(a.mobiles,',') FROM fwj.customer a; result: ["139","177","158"]
explode(arr):
该函数是一个表生成函数。输入一个列表参数,将列表中的每个值都转换为一行。
如:
SELECT explode(plit(a.mobiles,',')) mobiles FROM fwj.customer a; result: mobiles 139 177 158
3.第三种方法
问题虽然解决了,但还不够完美,表被读了两次。能不能一次就能取出我们想要的结果呢?
再来优化一下:
SELECT t.id,t.name,explode(split(t.mobiles,',')) mobiles FROM fwj.customer t
可惜不行,explode 这类UDTF函数不支持和其他字段一块被select。
不过,hive提供了 lateral view 侧视图 这个功能。
SELECT a.id,a.name,mob.mobile FROM fwj.customer a lateral view explode(split(a.mobiles,',')) mob AS mobile; result: id name mobile 1 jim 139 1 jim 177 1 jim 158
可以理解成在一次查询中 先生成了一个视图 mob 包含了行转列后的数据,之后从mob 中取出转换后的数据,其他字段仍旧从原表中取。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ng-zorro-antd 9.0 发布 ,支持 Angular 9 新特性!
版本介绍 欢迎来到ng-zorro-antd的9.0.0版本,升级到最新版本之后,开发者不仅可以享受到最新版本 Angular 的支持,还可以获得最新特性和更好的性能。 ng-zorro-antd 的部分 API 在 8.x 版本进入弃用状态,并且在开发环境中给出了警告提醒,所有之前弃用 API 在 9.0.0 不再支持,如果你之前已经根据告警信息修改了对应组件的使用方式,那么 9.0.0 版本升级不会有任何障碍,请按照以下步骤进行。 开始升级之前 首先确保你Node.js>=10.13 创建新的分支,或者使用其他方式备份当前项目 删除项目下 package-lock.json 文件 升级相关依赖 升级 Angular 主版本号至 9.0.0 版本,可以参考https://update.angular.io/ 如果你有单独使用@angular/cdk请执行ng update @angular/cdk 如果你有单独使用date-fns请先升级到2.x,升级指南 如果你有使用monaco-editor请先升级到0.2.x, 使用monaco-editor-webpack-plugin...
- 下一篇
如果遇到文件或数据库问题,如何重置Joomla
如果您在Joomla网站上遇到问题,那么重新安装其核心文件和数据库可能是最好的解决方案。 我们的客户支持团队使用这种经过测试的方法来解决数百个问题。 在这篇文章中,您将学习如何将Joomla核心文件和数据库重新安装到默认状态。 了解问题这种方法无法解决您的所有问题。它主要适用于Joomla核心引起的问题。 在运行Joomla核心更新后,通常会出现这些类型的问题。 如果由于某种原因(例如服务器资源耗尽或错误)而仅更新了一些文件,则可能经常会遇到致命错误或奇怪的可用性问题。 或者您可能发现您无法创建新项目。 但是,相同的升级可能在其他站点上也可以正常工作。在这种情况下,请尝试以下四个步骤。 第1步:创建您的Joomla网站备份 创建并下载您网站的备份,以防万一出问题。 第2步:修复您的Joomla核心文件权限 使用管理工具修复您的文件夹和文件权限。 第3步:重新安装Joomla Core文件 在您的Joomla后端中,转到组件> Joomla更新: 您将看到“ Joomla更新”屏幕。单击检查更新按钮: 向下滚动页面,然后单击“ 重新安装Joomla核心文件”按钮: 提示:如果问题仍...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境