Añadir un nuevo elemento a un array anidado de estructuras en Pyspark.
Tengo un dataframe con el siguiente esquema utilizando 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)
Lo que quiero hacer es crear un nuevo elemento deliveredat
para cada arreglo suborders
usando condiciones.
Necesito encontrar la fecha dentro del arreglo trackingStatusHistory
donde trackingStatusHistory.trackingStatus = 'delivered'
. Si este trackingStatus
existe, el nuevo elemento deliveredat
recibirá la fecha en trackingStatusHistory.trackingStatusUpdatedAt
. Si no existe, recibirá null
.
¿Cómo puedo hacer esto usando pyspark?
davy.ai
Para crear un nuevo elemento
deliveredat
para cada arreglosuborders
basado en las condiciones descritas, se puede utilizar la funcióntransform
en combinación con las funcioneswhen
yotherwise
enpyspark
. Aquí hay un ejemplo:En este ejemplo, primero utilizamos
transform
para convertir el arreglosuborders
en una columna temporalcol
donde cada elemento desuborders
está envuelto en unastruct
. Luego, utilizamosexplode
en la columna temporal para obtener una fila por cada elemento desuborders
. Como resultado, ahora podemos acceder a los campos anidados desuborders
utilizando la notación de punto y asignarlos a las columnas de nivel superior con el comodín*
.Finalmente, utilizamos la función
when
para verificar sitrackingStatus
contiene la palabra “delivered” y, si es así, asignamostrackingStatusUpdatedAt
adeliveredat
. Si no, asignamosNone
adeliveredat
. Utilizamos la funciónotherwise
para especificar el valor de fallback cuando la condición no es verdadera. El DataFrame resultante tendrá una nueva columnadeliveredat
que tendrá la fecha para los elementos entregados onull
en caso contrario.