apache-spark - 将数组分解为 2 列
问题描述
假设我们要跟踪一个包裹从仓库到客户的跃点。我们有一个存储数据的表,但数据在列中 SAY Route 包裹从仓库开始 – YYY,TTT,MMM 当包裹交付给 CUSTOMER 时跳数结束 Route 列中的值用空格分隔
ID Route
1 TTT A B X Y Z CUSTOMER
2 YYY E Y F G I P B X Q CUSTOMER
3 MMM R T K L CUSTOMER
预期产出
ID START END
1 TTT A
1 A B
1 B X
.
.
.
1 Z CUSTOMER
2 YYY E
2 E Y
2 Y F
.
.
2 Q CUSTOMER
3 MMM R
.
.
3 L CUSTOMER
无论如何在pyspark中实现这一点
解决方案
使用 将索引添加到拆分路线posexplode
,并使用 获取每个起始位置的下一个索引处的位置lead
。如果要删除索引,只需.drop('index')
在末尾添加即可。
import pyspark.sql.functions as F
from pyspark.sql.window import Window
df2 = df.select(
'ID',
F.posexplode(F.split('Route', ' ')).alias('index', 'start')
).withColumn(
'end',
F.lead('start').over(Window.partitionBy('ID').orderBy('index'))
).orderBy('ID', 'index').dropna()
df2.show(99,0)
+---+-----+-----+--------+
|ID |index|start|end |
+---+-----+-----+--------+
|1 |0 |TTT |A |
|1 |1 |A |B |
|1 |2 |B |X |
|1 |3 |X |Y |
|1 |4 |Y |Z |
|1 |5 |Z |CUSTOMER|
|2 |0 |YYY |E |
|2 |1 |E |Y |
|2 |2 |Y |F |
|2 |3 |F |G |
|2 |4 |G |I |
|2 |5 |I |P |
|2 |6 |P |B |
|2 |7 |B |X |
|2 |8 |X |Q |
|2 |9 |Q |CUSTOMER|
|3 |0 |MMM |R |
|3 |1 |R |T |
|3 |2 |T |K |
|3 |3 |K |L |
|3 |4 |L |CUSTOMER|
+---+-----+-----+--------+
推荐阅读
- c# - 或工具 - VRP - 处理无法找到最佳解决方案的案例
- laravel - Laravel Eloquent (eager loadable) 自定义多态关系
- google-tag-manager - 如何用 GTM 测量不可点击的跨度类?
- sql - 如何在连续语句之间从存储过程结果集中刷新@variable 的值?
- java - 每当我打开 RecyclerView 活动时,应用程序都会停止
- php - PHP imagick - 压缩上的白色方块
- c# - 如何通过同步方法使用 SendGrid C# 库发送电子邮件?
- javascript - 通过 crypto-js 解密 AES 256 CBC
- azure - Azure AD B2C 访问令牌声明在刷新令牌后不更新
- c# - 向 CDC 阅读器发送 AT 命令并获得响应