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

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() rn
    from temp
    cross join unnest(split(code, '、')) as t (sub_code)
    where id='1'
),
t2 as (
    select id,sub_name,row_number() over() rn
    from temp
    cross 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



http://www.kler.cn/a/231735.html

相关文章:

  • SQL面试题——抖音SQL面试题 主播播出时长
  • 使用Python和BeautifulSoup进行网页抓取:通过Python编程语言,结合BeautifulSoup库,可以轻松地从网站上抓取所需的信息。
  • 计算机组成与原理(2) basic of computer architecture
  • SpringBoot配置相关的内容
  • 工厂模式-简单工厂模式
  • 串口DMA接收不定长数据
  • c实现顺序表
  • 解决IntellIJ Idea内存不足
  • 为电子表格嵌入数据库,Excel/WPS一键升级为管理系统
  • C++实现鼠标点击和获取鼠标位置(编译环境visual studio 2022)
  • 问题 | 开源软件的影响力
  • mybatis-plus循环处理多个条件的 or 查询
  • SQL,HQL刷题,尚硅谷
  • 【力扣】移动零,双指针法
  • 【开源】JAVA+Vue.js实现在线课程教学系统
  • 前端JavaScript篇之对闭包的理解
  • JSP页面组件
  • Vue事件中如何使用 event 对象
  • LRU和LFU有什么区别
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • 探索C语言中的联合体与枚举:数据多面手的完美组合!
  • 掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧
  • 在Ubuntu上安装JetBrains Toolbox并解决libfuse.so.2依赖问题
  • 搭建macOS开发环境-1:准备工作
  • 显示器颜色显示技术原理
  • 3.0 Hadoop 概念