es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear un nuevo elemento deliveredat para cada arreglo suborders basado en las condiciones descritas, se puede utilizar la función transform en combinación con las funciones when y otherwise en pyspark. Aquí hay un ejemplo:

    from pyspark.sql.functions import col, explode, when
    
    # Supongamos que el DataFrame original se llama 'df'
    df_new = df.selectExpr("transform(suborders, suborder -> struct(*) as suborder)") \
        .select(explode(col("col")).alias("suborder")) \
        .select(
            col("suborder.*"),
            when(
                col("suborder.trackingStatusHistory.trackingStatus").contains("delivered"),
                col("suborder.trackingStatusHistory.trackingStatusUpdatedAt")
            ).otherwise(None).alias("deliveredat")
        )
    

    En este ejemplo, primero utilizamos transform para convertir el arreglo suborders en una columna temporal col donde cada elemento de suborders está envuelto en una struct. Luego, utilizamos explode en la columna temporal para obtener una fila por cada elemento de suborders. Como resultado, ahora podemos acceder a los campos anidados de suborders 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 si trackingStatus contiene la palabra “delivered” y, si es así, asignamos trackingStatusUpdatedAt a deliveredat. Si no, asignamos None a deliveredat. Utilizamos la función otherwise para especificar el valor de fallback cuando la condición no es verdadera. El DataFrame resultante tendrá una nueva columna deliveredat que tendrá la fecha para los elementos entregados o null en caso contrario.

Comments are closed.