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

列转行-lateral view explode列转行

一、基础数据

现有骑手id,订单id列表,订单配送距离列表,配送费列表,其中订单id、配送距离、配送费一一对应。

+-----------+---------------------------+----------------------------+-----------------------------+
| rider_id  |        order_list         |       distance_list        |        payment_list         |
+-----------+---------------------------+----------------------------+-----------------------------+
| r001      | 0001,0005,0008            | 8.05,2.32,4.35             | 7.50,5.00,15.00             |
| r002      | 0002,0004,0006,0009,0010  | 3.01,10.98,0.78,5.05,6.05  | 13.00,15.00,5.00,9.50,7.00  |
| r003      | 0003,0007                 | 4.12,8.11                  | 3.50,8.00                   |
| r004      | NULL                      | NULL                       | NULL                        |
+-----------+---------------------------+----------------------------+-----------------------------+

二、函数介绍

  • explode
  • split

三、列转行

将骑手及其订单转换成订单粒度,每单一行记录。

期望结果

+-----------+-----------+
| rider_id  | order_id  |
+-----------+-----------+
| r001      | 0001      |
| r001      | 0005      |
| r001      | 0008      |
| r002      | 0002      |
| r002      | 0004      |
| r002      | 0006      |
| r002      | 0009      |
| r002      | 0010      |
| r003      | 0003      |
| r003      | 0007      |
+-----------+-----------+

1、解决方案

先将字符串通过split函数转换成array,然后使用explode炸开,即可得到最终结果。

select rider_id, order_id
from t2_delivery_orders
         lateral view explode(split(order_list, ',')) t2 as order_id

执行结果

+-----------+-----------+
| rider_id  | order_id  |
+-----------+-----------+
| r001      | 0001      |
| r001      | 0005      |
| r001      | 0008      |
| r002      | 0002      |
| r002      | 0004      |
| r002      | 0006      |
| r002      | 0009      |
| r002      | 0010      |
| r003      | 0003      |
| r003      | 0007      |
+-----------+-----------+

2、注意

由于我们使用了lateral view横向视图与explode结合炸裂,我们会发现 骑手r004因为其order_list为空没有出现在最终结果中。原因为在explode处理order_list时因为r004对应行记录为null而直接剔除了,lateral view 关联方式为inner join 方式,导致最终结果中无对应数据。

四、数据准备

--建表语句
CREATE TABLE IF NOT EXISTS t2_delivery_orders
(
    rider_id      string, -- 骑手ID
    order_list    string, -- 订单id列表
    distance_list STRING, --订单距离列表
    payment_list  STRING  --配送费列表
)
    COMMENT '骑手配送订单表';
--插入数据
INSERT INTO t2_delivery_orders VALUES
('r001', '0001,0005,0008', '8.05,2.32,4.35', '7.50,5.00,15.00'),
('r002', '0002,0004,0006,0009,0010', '3.01,10.98,0.78,5.05,6.05', '13.00,15.00,5.00,9.50,7.00'),
('r003', '0003,0007', '4.12,8.11', '3.50,8.00'),
('r004', null, null, null);

相关推荐

  1. 行转列-collect_list,collect_set进行简单行转列
  2. 行转列-使用transform进行有序行转列
  3. 行转列-使用transform进行有序行转列-多列一一对应
  4. 行转列-多行转多列(竖表转横表)
  5. 列转行-多列转多行(横表变竖表)
  6. 列转行-lateral view explode列转行
  7. 列转行-explode_outer和lateral view outer
  8. 列转行-posexplode多列对应转行
  9. 列转行-lateral view outer posexplode及posexplode_outer多列对应转行

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

相关文章:

  • 【流量分析】常见webshell流量分析
  • 【springboot】启动原理
  • 快排和归并
  • django解决跨域问题
  • http响应码https的区别
  • Pandas进行周期与时间戳转换
  • SQLAlchemy:Python SQL工具包和对象关系映射器
  • Kubernetes 简介与部署全攻略
  • 我使用了ChatGPT中的DALL-E创建了7张时尚客厅图片
  • 如何理解进程和线程之间的关系
  • 基于PHP评论区的存储型XSS漏洞
  • 中间件解析漏洞(附环境搭建教程)
  • Rust :也谈Json与转换
  • Harmony南向驱动开发: HDC与真机调试
  • Java【数组】
  • Docker占用根目录/存储空间过多如何清理?
  • windows@命令行安装国内软件@scoop和winget安装国内软件
  • 设计模式—2—单例模式
  • 【C++ 第二十章】模拟实现 shared_ptr(可以拷贝的智能指针)
  • 【Ubuntu20.04】配置深度学习环境
  • 机器学习周报(8.26-9.1)
  • 【C++ Primer Plus习题】9.3
  • C# 删除Word文档中的段落
  • Golang 内存泄漏详解:原因、检测与修复
  • 【论文阅读】LLM4CP: Adapting Large Language Models for Channel Prediction(2024)
  • 啄木鸟上门安装维修系统源码开发