前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >列转行-lateral view outer posexplode及posexplode_outer多列对应转行

列转行-lateral view outer posexplode及posexplode_outer多列对应转行

作者头像
数据仓库晨曦
发布于 2024-08-27 11:56:21
发布于 2024-08-27 11:56:21
15900
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

一、基础数据

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-----------+---------------------------+----------------------------+-----------------------------+
| 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                        |
+-----------+---------------------------+----------------------------+-----------------------------+

二、函数介绍

  • split
  • posexplode_outer
  • nvl
  • coalesce
  • equal_null

三、列转行

原始数据中order_list中的数据,与distance_list、payment_list内的数据,一一对应,请将数据拆解出rider_id、order_id,distance,payment,其中distance和payment为对应订单id的距离和配送费。需要把骑手r004数据进行展示

期望结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-----------+-----------+-----------+----------+
| 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     |
| r004      | NULL      | NULL      | NULL     |
+-----------+-----------+-----------+----------+

1、使用posexplode_outer处理

我们先看下posexplode_outer 处理order_list的结果

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select rider_id, t2.pos, t2.order_id
from t2_delivery_orders t1
         lateral view posexplode_outer(split(order_list, ',')) t2 as pos, order_id

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-----------+-------+-----------+
| 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      |
| r004      | NULL  | NULL      |
+-----------+-------+-----------+

上面可以看到,pos列及order_id 列均为null。

2、处理空值得到结果

该题目与列转行posexplode多列对应转行 思路并无不同,只需要在where条件判断pos是否相等时增加对null的处理。

2.1 nvl或者coalesce对空值处理

因为pos是数组的脚标,所以如果是空值,我们处理成一个负数即可。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select rider_id, order_id, t3.distance, t4.payment
from t2_delivery_orders t1
         lateral view posexplode_outer(split(order_list, ',')) t2 as pos, order_id
         lateral view posexplode_outer(split(distance_list, ',')) t3 as pos, distance
         lateral view posexplode_outer(split(payment_list, ',')) t4 as pos, payment
where nvl(t2.pos, -1) = nvl(t3.pos, -1)
  and nvl(t2.pos, -1) = nvl(t4.pos, -1)

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-----------+-----------+-----------+----------+
| 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     |
| r004      | NULL      | NULL      | NULL     |
+-----------+-----------+-----------+----------+
2.2 使用equal_null判断空值

2.1解法是对空值进行处理后判断,假如没有合适的默认值给空值赋值,我们也可以用equal_null直接对空值进行判断是否全为空值,进行匹配

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select rider_id, order_id, t3.distance, t4.payment
from t2_delivery_orders t1
         lateral view posexplode_outer(split(order_list, ',')) t2 as pos, order_id
         lateral view posexplode_outer(split(distance_list, ',')) t3 as pos, distance
         lateral view posexplode_outer(split(payment_list, ',')) t4 as pos, payment
where equal_null(t2.pos,t3.pos)
  and equal_null(t2.pos,t4.pos)

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-----------+-----------+-----------+----------+
| 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     |
| r004      | NULL      | NULL      | NULL     |
+-----------+-----------+-----------+----------+

注意,equal_null是spark从版本3.4.0开始支持

3、lateral view outer posexplode处理方式

除了使用posexplode_outer

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select rider_id, order_id, t3.distance, t4.payment
from t2_delivery_orders t1
         lateral view outer posexplode(split(order_list, ',')) t2 as pos, order_id
         lateral view outer posexplode(split(distance_list, ',')) t3 as pos, distance
         lateral view outer posexplode(split(payment_list, ',')) t4 as pos, payment
where equal_null(t2.pos,t3.pos)
  and equal_null(t2.pos,t4.pos)

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-----------+-----------+-----------+----------+
| 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     |
| r004      | NULL      | NULL      | NULL     |
+-----------+-----------+-----------+----------+

四、数据准备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--建表语句
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);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
列转行-posexplode多列对应转行
现有骑手id,订单id列表,订单配送距离列表,配送费列表,其中订单id、配送距离、配送费一一对应。
数据仓库晨曦
2024/08/21
3070
列转行-posexplode多列对应转行
列转行-lateral view explode列转行
现有骑手id,订单id列表,订单配送距离列表,配送费列表,其中订单id、配送距离、配送费一一对应。
数据仓库晨曦
2024/08/19
1800
列转行-lateral view explode列转行
列转行-explode_outer及lateral view outer
现有骑手id,订单id列表,订单配送距离列表,配送费列表,其中订单id、配送距离、配送费一一对应。
数据仓库晨曦
2024/08/20
1560
列转行-explode_outer及lateral view outer
行转列-多列一一对应
根据配送订单记录表,查询出骑手id,配送订单id列表、距离列表、配送费列表,要求三列中的数据按照送达时间顺序,且一一对应;
数据仓库晨曦
2024/08/14
1640
行转列-多列一一对应
(文末有福利)使用collec_list、collect_set函数进行行转列
该函数是非确定性的,因为收集结果的顺序取决于行的顺序,这在经过shuffle之后可能是不确定的。
数据仓库晨曦
2024/08/12
1960
(文末有福利)使用collec_list、collect_set函数进行行转列
行转列-有序行转列
根据配送订单记录表,查询出骑手id,顾客id列表,要求顾客id列表中的顺序按照送达时间早晚排序。
数据仓库晨曦
2024/08/13
1300
学习SQL【9】-集合与联结
现在我们开始学习使用2张以上的表的SQL语句。通过以行方向为单位的集合运算符和以列方向为单位的联结,就可以将分散在多张表中的数据组合成期望的结果。 表的加减法 什么是集合运算 集合在数据库中表示为记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合。 集合运算就是对满足同一规则的记录进行的加减等四则运算。 用来进行集合运算的运算符称为集合运算符。 表的加法—UNION UNION(并集)是进行记录加法运算的集合运算符。在学习使用方法之前,我们先创建一张表: --创建表Product2(商品2)
爱吃西瓜的番茄酱
2018/04/04
1.3K0
最强最全面的大数据SQL面试题和答案(由31位大佬共同协作完成)
本套SQL题的答案是由许多大佬共同贡献,1+1的力量是远远大于2的,有不少题目都采用了非常巧妙的解法,也有不少题目有多种解法。本套大数据SQL题不仅题目丰富多样,答案更是精彩绝伦!
五分钟学大数据
2021/12/27
5.2K0
双流Join底层原理
为了保障左右两边流中需要Join的数据出现在相同节点,Flink SQL会利用Join中的on的关联条件进行分区,把相同关联条件 的数据分发到同一个分区里面。
zeekling
2023/03/08
4740
双流Join底层原理
Apache-Flink深度解析-JOIN-LATERAL-Time Interval(Time-windowed)
JOIN 算子是数据处理的核心算子,前面我们在《Apache Flink 漫谈系列(09) - JOIN 算子》介绍了UnBounded的双流JOIN,在《Apache Flink 漫谈系列(10) - JOIN LATERAL》介绍了单流与UDTF的JOIN操作,在《Apache Flink 漫谈系列(11) - Temporal Table JOIN》又介绍了单流与版本表的JOIN,本篇将介绍在UnBounded数据流上按时间维度进行数据划分进行JOIN操作 - Time Interval(Time-windowed)JOIN, 后面我们叫做Interval JOIN。
王知无-import_bigdata
2019/03/26
8580
MySQL之多表查询
阅读目录 一 多表联合查询 二 多表连接查询 三 复杂条件多表查询 四 子语句查询 五 其他方式查询 六 SQL逻辑查询语句执行顺序(重点) 七 外键约束 八 其他约束类型 九 表与表之间的关系 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dname VARCHAR(50) not null COMMENT '部门名称' )ENG
人生不如戏
2018/04/10
8.7K0
MySQL之多表查询
Flink SQL中的Join操作
Flink SQL 支持对动态表进行复杂灵活的连接操作。 有几种不同类型的连接来解决可能需要的各种语义查询。
从大数据到人工智能
2022/02/24
5.4K0
Hive 中的复合数据结构简介以及一些函数的用法说明
目前 hive 支持的复合数据类型有以下几种: map (key1, value1, key2, value2, ...) Creates a map with the given key/value pairs struct   (val1, val2, val3, ...) Creates a struct with the given field values. Struct field names will be col1, col2, ... named_struct   (name1,
用户1177713
2018/02/24
4K0
Hive 中的复合数据结构简介以及一些函数的用法说明
Apache-Flink深度解析-TableAPI
SQL和Table API是Apache Flink中的同一层次的API抽象,如下图所示:
王知无-import_bigdata
2019/03/26
1.3K0
Apache-Flink深度解析-TableAPI
在《SQL概览》中我们概要的向大家介绍了什么是好SQL,SQL和Table API是Apache Flink中的同一层次的API抽象,如下图所示
王知无-import_bigdata
2019/04/24
7160
Apache-Flink深度解析-TableAPI
数仓搭建DWD层
启动日志解析思路:启动日志表中每行数据对应一个启动记录,一个启动记录应该包含日志中的公共信息和启动信息。先将所有包含start字段的日志过滤出来,然后使用get_json_object函数解析每个字段。
全栈程序员站长
2022/09/13
7180
Apache-Flink深度解析-SQL概览
SQL是Structured Query Language的缩写,最初是由美国计算机科学家Donald D. Chamberlin和Raymond F. Boyce在20世纪70年代早期从 Early History of SQL 中了解关系模型后在IBM开发的。该版本最初称为[SEQUEL: A Structured English Query Language](结构化英语查询语言),旨在操纵和检索存储在IBM原始准关系数据库管理系统System R中的数据。SEQUEL后来改为SQL,因为“SEQUEL”是英国Hawker Siddeley飞机公司的商标。我们看看这款用于特技飞行的英国皇家空军豪客Siddeley Hawk T.1A (Looks great):
王知无-import_bigdata
2019/03/26
7820
最强最全面的Hive SQL开发指南,超四万字全面解析!
hive -S -e 'select table_cloum from table' -S,终端上的输出不会有mapreduce的进度,执行完毕,只会把查询结果输出到终端上。
五分钟学大数据
2021/12/02
7.9K0
最强最全面的Hive SQL开发指南,超四万字全面解析!
Flink SQL 知其所以然(二十六):2w 字详述 Join 操作(大威天龙)
可以发现 Inner Interval Join 和其他三种 Outer Interval Join 的区别在于,Outer 在随着时间推移的过程中,如果有数据过期了之后,会根据是否是 Outer 将没有 Join 到的数据也给输出。
公众号:大数据羊说
2022/07/07
2.4K0
Flink SQL 知其所以然(二十六):2w 字详述 Join 操作(大威天龙)
一文学完所有的Hive Sql(两万字最全详解)
lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。
五分钟学大数据
2021/04/02
3.2K0
相关推荐
列转行-posexplode多列对应转行
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档