首页 > 其他分享 >列转行-posexplode多列对应转行

列转行-posexplode多列对应转行

时间:2024-09-08 18:53:25浏览次数:9  
标签:转行 list pos posexplode r002 r001 多列 order id

一、基础数据

现有骑手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                        |
+-----------+---------------------------+----------------------------+-----------------------------+

二、函数介绍

三、列转行

原始数据中order_list中的数据,与distance_list、payment_list内的数据,一一对应,请将数据拆解出rider_id、order_id,distance,payment,其中distance和payment为对应订单id的距离和配送费。

期望结果

+-----------+-----------+-----------+----------+
| rider_id  | order_id  | distance  | payment  |
+-----------+-----------+-----------+----------+
| r001      | 0001      | 8.05      | 7.50     |
| r001      | 0005      | 2.32      | 5.00     |
| r001      | 0008      | 4.35      | 15.00    |
| r002      | 0002      | 3.01      | 13.00    |
| r002      | 0004      | 10.98     | 15.00    |
| r002      | 0006      | 0.78      | 5.00     |
| r002      | 0009      | 5.05      | 9.50     |
| r002      | 0010      | 6.05      | 7.00     |
| r003      | 0003      | 4.12      | 3.50     |
| r003      | 0007      | 8.11      | 8.00     |
+-----------+-----------+-----------+----------+

1、posexplode函数实现带位置的炸裂

我们通过posexplode对order_list 进行炸裂,查看带位置的数据

执行SQL

select rider_id, t2.pos, t2.order_id
from t2_delivery_orders t1
         lateral view posexplode(split(order_list, ',')) t2 as pos, order_id

SQL结果

+-----------+------+-----------+
| rider_id  | pos  | order_id  |
+-----------+------+-----------+
| r001      | 0    | 0001      |
| r001      | 1    | 0005      |
| r001      | 2    | 0008      |
| r002      | 0    | 0002      |
| r002      | 1    | 0004      |
| r002      | 2    | 0006      |
| r002      | 3    | 0009      |
| r002      | 4    | 0010      |
| r003      | 0    | 0003      |
| r003      | 1    | 0007      |
+-----------+------+-----------+

上面可以看到,pos列是orderid中每个订单对应的数组下标。

2、posexplode 同时处理两列

使用posexplode同时对order_list 和 distance_list 进行炸裂处理

执行SQL

select rider_id, t2.pos, t2.order_id, t3.pos as t3_pos, t3.distance
from t2_delivery_orders t1
         lateral view posexplode(split(order_list, ',')) t2 as pos, order_id
         lateral view posexplode(split(distance_list, ',')) t3 as pos, distance

SQL结果

+-----------+------+-----------+---------+-----------+
| rider_id  | pos  | order_id  | t3_pos  | distance  |
+-----------+------+-----------+---------+-----------+
| r001      | 0    | 0001      | 0       | 8.05      |
| r001      | 0    | 0001      | 1       | 2.32      |
| r001      | 0    | 0001      | 2       | 4.35      |
| r001      | 1    | 0005      | 0       | 8.05      |
| r001      | 1    | 0005      | 1       | 2.32      |
| r001      | 1    | 0005      | 2       | 4.35      |
| r001      | 2    | 0008      | 0       | 8.05      |
| r001      | 2    | 0008      | 1       | 2.32      |
| r001      | 2    | 0008      | 2       | 4.35      |
| r002      | 0    | 0002      | 0       | 3.01      |
| r002      | 0    | 0002      | 1       | 10.98     |
| r002      | 0    | 0002      | 2       | 0.78      |
| r002      | 0    | 0002      | 3       | 5.05      |
| r002      | 0    | 0002      | 4       | 6.05      |
| r002      | 1    | 0004      | 0       | 3.01      |
| r002      | 1    | 0004      | 1       | 10.98     |
| r002      | 1    | 0004      | 2       | 0.78      |
| r002      | 1    | 0004      | 3       | 5.05      |
| r002      | 1    | 0004      | 4       | 6.05      |
| r002      | 2    | 0006      | 0       | 3.01      |
| r002      | 2    | 0006      | 1       | 10.98     |
| r002      | 2    | 0006      | 2       | 0.78      |
| r002      | 2    | 0006      | 3       | 5.05      |
| r002      | 2    | 0006      | 4       | 6.05      |
| r002      | 3    | 0009      | 0       | 3.01      |
| r002      | 3    | 0009      | 1       | 10.98     |
| r002      | 3    | 0009      | 2       | 0.78      |
| r002      | 3    | 0009      | 3       | 5.05      |
| r002      | 3    | 0009      | 4       | 6.05      |
| r002      | 4    | 0010      | 0       | 3.01      |
| r002      | 4    | 0010      | 1       | 10.98     |
| r002      | 4    | 0010      | 2       | 0.78      |
| r002      | 4    | 0010      | 3       | 5.05      |
| r002      | 4    | 0010      | 4       | 6.05      |
| r003      | 0    | 0003      | 0       | 4.12      |
| r003      | 0    | 0003      | 1       | 8.11      |
| r003      | 1    | 0007      | 0       | 4.12      |
| r003      | 1    | 0007      | 1       | 8.11      |
+-----------+------+-----------+---------+-----------+

可以看到结果中,两列均炸开了,但是炸开的结果order_list和distance_list中的元素数据进行了笛卡尔积。我们想要一一对应,添加where条件限制两个pos相等

执行SQL

select rider_id, t2.pos, t2.order_id, t3.pos as t3_pos, t3.distance
from t2_delivery_orders t1
         lateral view posexplode(split(order_list, ',')) t2 as pos, order_id
         lateral view posexplode(split(distance_list, ',')) t3 as pos, distance
where t2.pos = t3.pos

SQL结果

+-----------+------+-----------+---------+-----------+
| rider_id  | pos  | order_id  | t3_pos  | distance  |
+-----------+------+-----------+---------+-----------+
| r001      | 0    | 0001      | 0       | 8.05      |
| r001      | 1    | 0005      | 1       | 2.32      |
| r001      | 2    | 0008      | 2       | 4.35      |
| r002      | 0    | 0002      | 0       | 3.01      |
| r002      | 1    | 0004      | 1       | 10.98     |
| r002      | 2    | 0006      | 2       | 0.78      |
| r002      | 3    | 0009      | 3       | 5.05      |
| r002      | 4    | 0010      | 4       | 6.05      |
| r003      | 0    | 0003      | 0       | 4.12      |
| r003      | 1    | 0007      | 1       | 8.11      |
+-----------+------+-----------+---------+-----------+

可以看到这个是符合我们预期的了。

3、查询结果

增加对payment_list的处理,select 去掉pos相关列,得到最终结果

执行SQL

select rider_id, order_id, t3.distance, t4.payment
from t2_delivery_orders t1
         lateral view posexplode(split(order_list, ',')) t2 as pos, order_id
         lateral view posexplode(split(distance_list, ',')) t3 as pos, distance
         lateral view posexplode(split(payment_list, ',')) t4 as pos, payment
where t2.pos = t3.pos
  and t2.pos = t4.pos

SQL结果

+-----------+-----------+-----------+----------+
| rider_id  | order_id  | distance  | payment  |
+-----------+-----------+-----------+----------+
| r001      | 0001      | 8.05      | 7.50     |
| r001      | 0005      | 2.32      | 5.00     |
| r001      | 0008      | 4.35      | 15.00    |
| r002      | 0002      | 3.01      | 13.00    |
| r002      | 0004      | 10.98     | 15.00    |
| r002      | 0006      | 0.78      | 5.00     |
| r002      | 0009      | 5.05      | 9.50     |
| r002      | 0010      | 6.05      | 7.00     |
| r003      | 0003      | 4.12      | 3.50     |
| r003      | 0007      | 8.11      | 8.00     |
+-----------+-----------+-----------+----------+

四、数据准备

--建表语句
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多列对应转行

标签:转行,list,pos,posexplode,r002,r001,多列,order,id
From: https://blog.csdn.net/thenowaiting/article/details/142031194

相关文章

  • 列转行-explode_outer及lateral view outer
    一、基础数据现有骑手id,订单id列表,订单配送距离列表,配送费列表,其中订单id、配送距离、配送费一一对应。+-----------+---------------------------+----------------------------+-----------------------------+|rider_id|order_list|dista......
  • 24程序员转行,首选为什么是它?
    今天文章的主人公暂且称他为A君。不过A君有点特别,非科班,工作10年后才转行iOS程序员。今年36岁,目前在某行业头部企业任职前端负责人,管理40+人的前端团队。废话不多说,我们开始A君(为了描述方便,后面用第一人称描述)的逆袭故事吧!浑浑噩噩的10年我1985年出生......
  • AI产品经理:零经验转行AI产品经理:从入门到精通的全面指南
    本篇文章来自于一个YouTube视频的内容,对于如何成为AI产品是一个很好的入门贴,这篇文章也是通过AI协助编辑过来的。通过这次编辑,也初步尝试了各大Chatbot的能力,总体体验,拥有长上下文能力的kimibot的体验最好,能将4000+字的英文完整翻译并进行初步的排版。但是通过这个......
  • My SQL 列转行操作
    原表结构如下,我们可以发现,“日运输量”和“车次”是在同一张表中相互独立的两个字段,即独立的两列数据,下面,我将系统中的测试数据以及代码全部放出来,以解释列转行的操作方法 原表数据库查询代码:1SELECT2yzrqAS运作日期,3DATE_FORMAT(yzrq,'%Y-%m')AS年月,......
  • 为什么越来越多的IT青年转行网络安全?
      目前,我国互联网已经从爆发增长期进入平稳发展阶段,同时每年大量计算机相关专业的毕业生涌入就业市场,导致IT行业逐渐趋于饱和状态,甚至出现裁员现象,去年很多大厂都有裁员,不少程序员再就业成了难题。面对这样的就业环境,IT青年该如何规划未来的职业方向?这的确是一个需要认真思......
  • 为什么越来越多的IT青年转行网络安全?
      目前,我国互联网已经从爆发增长期进入平稳发展阶段,同时每年大量计算机相关专业的毕业生涌入就业市场,导致IT行业逐渐趋于饱和状态,甚至出现裁员现象,去年很多大厂都有裁员,不少程序员再就业成了难题。面对这样的就业环境,IT青年该如何规划未来的职业方向?这的确是一个需要认真思......
  • Java卷上天,可以转行干什么?
     小刚是某名企里的一位有5年经验的高级Java开发工程师,每天沉重的的工作让他疲惫不堪,让他萌生出想换工作的心理,但是转行其他工作他又不清楚该找什么样的工作因为JAVA这几年的更新实在是太太太……快了,JAVA8都还没用多久,16都已经发布了。自从JAVA8发布了Lambda和Stre......
  • Java卷上天,可以转行干什么?
     小刚是某名企里的一位有5年经验的高级Java开发工程师,每天沉重的的工作让他疲惫不堪,让他萌生出想换工作的心理,但是转行其他工作他又不清楚该找什么样的工作因为JAVA这几年的更新实在是太太太……快了,JAVA8都还没用多久,16都已经发布了。自从JAVA8发布了Lambda和Stre......
  • 25岁,转行网络安全工程师来的赢吗?
    先说结论:一点不晚!首先说一下这个行业的现状,真正科班出身软件测试专业的很少,因为只有个别院校有这个专业,根据了解也是教的很浅,对接不了企业的需求。那么说根据目前的现状,可以将这个行业的从业者分为这么几类:第一种,应届毕业生,要么是本专业学的就是这个,要么是在毕业之前就有......
  • AI产品经理薪资揭秘:起薪30k不是梦!零基础转行攻略大公开
    2024年,还有什么新风口?AI、元宇宙、NFT…很多人不知道,其实不管是元宇宙还是NFT,它们本质上就是人工智能领域。AI自身应用领域非常广泛,大批高薪岗位随之涌了出来,包括AI产品经理。AI产品经历具体工作内容是什么?薪资有多香?普通人如何进入AI人工智能行业?需要写代码吗?别急,小......