当前位置: 首页 > news >正文

Hive与Presto中的列转行区别

Hive与Presto列转行的区别

    • 1、背景描述
    • 2、Hive/Spark列转行
    • 3、Presto列转行



1、背景描述


在处理数据时,我们经常会遇到一个字段存储多个值,这时需要把一行数据转换为多行数据,形成标准的结构化数据

例如,将下面的两列数据并列转换为三行,使得codename一一对应

idcodename
1a、b、cA、B、C

Hive、Spark和Presto都提供了这种实现,但有所不同。下面通过这个案例介绍三者之间的区别及注意事项

2、Hive/Spark列转行


Hive和Spark都可以使用lateral view posexplode实现:

select id, pos1, sub_code, pos2, sub_name from tmp
lateral view posexplode(split(code,'、')) v1 as pos1, sub_code
lateral view posexplode(split(name,'、')) v2 as pos2, sub_name
where id='1' and pos1=pos2

Hive On MapReduce与Hive On Spark的执行结果如下:

idsub_codesub_name
1aA
1bB
1cC

值得注意的是,lateral view posexplode会自动过滤被转换列字段值为空的数据,进而导致数据丢失

优化方案是将lateral view修改为lateral view outer后尝试

更多关于lateral view UDTF的使用见文章:传送门

3、Presto列转行


使用PrestoSQL的交叉连接cross join unnest实现:

with t1 as(select id,sub_code,row_number() over() rnfrom tempcross join unnest(split(code, '、')) as t (sub_code)where id='1'
),
t2 as (select id,sub_name,row_number() over() rnfrom tempcross join unnest(split(name, '、')) as t (sub_name)where id='1'
)
select t1.id, t1.sub_code, t2.sub_name
from t1
left join t2 
on t1.rn = t2.rn
order by t1.rn

PrestoSQL的执行结果如下:

idsub_codesub_name
1bB
1aA
1cC

需要注意的是,cross join unnest不会自动过滤被转换列和转换列字段值为空的数据,因此此方式数据不会丢失

例如,当转换列字段值存在空值时:

idcodename
1a、b、cA、B

cross join unnest列转行的结果为

idsub_codesub_name
1aA
1cNULL
1bB

当被转换列字段值存在空值时:

idcodename
1a、b、cNULL

cross join unnest列转行的结果为

idsub_codesub_name
1bNULL
1aNULL
1cNULL


相关文章:

  • “Hopf Oscillator-Based Gait Transition for A Quadruped Robot“代码复现
  • 致我的2023年——个人学年总结
  • 使用 Elasticsearch 和 OpenAI 构建生成式 AI 应用程序
  • HTTPS 的加密流程
  • 【跳槽须知】关于企业所签订的竞业协议你知道多少?
  • 2024年华为OD机试真题-螺旋数字矩阵-Java-OD统一考试(C卷)
  • Linux中ps/kill/execl的使用
  • FPS游戏框架漫谈第二十天
  • Redis面试题41
  • 2024美赛数学建模C题完整论文教学(含十几个处理后数据表格及python代码)
  • Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
  • 关闭Ubuntu 默认开启的自动安全更新
  • easyexcel解析跨多行的数据
  • 【STL】list模拟实现
  • pnpm + vite 从外网迁移到内网环境开发
  • ----------
  • 【EOS】Cleos基础
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript新鲜事·第5期
  • Ruby 2.x 源代码分析:扩展 概述
  • Vue 2.3、2.4 知识点小结
  • 排序算法之--选择排序
  • 我从编程教室毕业
  • 栈实现走出迷宫(C++)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​水经微图Web1.5.0版即将上线
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (LeetCode C++)盛最多水的容器
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计高校学生选课系统
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)插入排序
  • (原創) 物件導向與老子思想 (OO)
  • (转)Sublime Text3配置Lua运行环境
  • .gitignore文件设置了忽略但不生效
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /etc/sudoers (root权限管理)
  • @Bean注解详解
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [20180224]expdp query 写法问题.txt
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [C++]C++类基本语法
  • [CakePHP] 在Controller中使用Helper
  • [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解