将新元素添加到结构 pyspark 的嵌套数组
Add new element to nested array of structs pyspark
我有一个使用 pyspark 的具有以下模式的数据框:
|-- suborders: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- trackingStatusHistory: array (nullable = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- trackingStatusUpdatedAt: string (nullable = true)
| | | | |-- trackingStatus: string (nullable = true)
我想要做的是使用条件为每个 suborders
数组创建一个新的 deliveredat
元素。
我需要在 trackingStatusHistory
数组中找到 trackingStatusHistory.trackingStatus = 'delivered'
的日期。如果此 trackingStatus
存在,新的 deliveredat
元素将收到 trackingStatusHistory.trackingStatusUpdatedAt
中的日期。如果不存在,则接收 null
.
如何使用 pyspark 执行此操作?
您可以在数组上使用高阶函数 transform
+ filter
来做到这一点。对于 suborders
数组的每个结构元素,您通过过滤子数组 trackingStatusHistory
并获取交货日期来添加一个新字段,如下所示:
import pyspark.sql.functions as F
df = df.withColumn(
"suborders",
F.expr("""transform(
suborders,
x -> struct(
filter(x.trackingStatusHistory, y -> y.trackingStatus = 'delivered')[0].trackingStatusUpdatedAt as deliveredAt,
x.trackingStatusHistory as trackingStatusHistory
)
)
""")
)
我有一个使用 pyspark 的具有以下模式的数据框:
|-- suborders: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- trackingStatusHistory: array (nullable = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- trackingStatusUpdatedAt: string (nullable = true)
| | | | |-- trackingStatus: string (nullable = true)
我想要做的是使用条件为每个 suborders
数组创建一个新的 deliveredat
元素。
我需要在 trackingStatusHistory
数组中找到 trackingStatusHistory.trackingStatus = 'delivered'
的日期。如果此 trackingStatus
存在,新的 deliveredat
元素将收到 trackingStatusHistory.trackingStatusUpdatedAt
中的日期。如果不存在,则接收 null
.
如何使用 pyspark 执行此操作?
您可以在数组上使用高阶函数 transform
+ filter
来做到这一点。对于 suborders
数组的每个结构元素,您通过过滤子数组 trackingStatusHistory
并获取交货日期来添加一个新字段,如下所示:
import pyspark.sql.functions as F
df = df.withColumn(
"suborders",
F.expr("""transform(
suborders,
x -> struct(
filter(x.trackingStatusHistory, y -> y.trackingStatus = 'delivered')[0].trackingStatusUpdatedAt as deliveredAt,
x.trackingStatusHistory as trackingStatusHistory
)
)
""")
)