将新元素添加到结构 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
                        )
                )
    """)
)