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.

Actualizar estructura anidada en un conjunto de datos en Spark desde otra columna de estructura.

Tengo el siguiente conjunto de datos Spark con un tipo de estructura anidada:

-- _1: struct (nullable = false)
 |    |-- _1: struct (nullable = false)
 |    |    |-- _1: struct (nullable = false)
 |    |    |    |-- ni_number: string (nullable = true)
 |    |    |    |-- national_registration_number: string (nullable = true)
 |    |    |    |-- id_issuing_country: string (nullable = true)
 |    |    |    |-- doc_type_name: string (nullable = true)
 |    |    |    |-- brand: string (nullable = true)
 |    |    |    |-- company_name: string (nullable = true)
 |    |    |-- _2: struct (nullable = true)
 |    |    |    |-- municipality: string (nullable = true)
 |    |    |    |-- country: string (nullable = true)
 |    |-- _2: struct (nullable = true)
 |    |    |-- brand_name: string (nullable = true)
 |    |    |-- puk: string (nullable = true)
 |-- _2: struct (nullable = true)
 |    |-- customer_servicesegment: string (nullable = true)
 |    |-- customer_category: string (nullable = true)

Mi objetivo aquí es realizar algunas desanidaciones en la parte inferior de la estructura y tener este esquema de destino:

-- _1: struct (nullable = false)
 |    |-- _1: struct (nullable = false)
 |    |    |-- _1: struct (nullable = false)
 |    |    |    |-- ni_number: string (nullable = true)
 |    |    |    |-- national_registration_number: string (nullable = true)
 |    |    |    |-- id_issuing_country: string (nullable = true)
 |    |    |    |-- doc_type_name: string (nullable = true)
 |    |    |    |-- brand: string (nullable = true)
 |    |    |    |-- company_name: string (nullable = true)
 |    |    |-- _2: struct (nullable = true)
 |    |    |    |-- municipality: string (nullable = true)
 |    |    |    |-- country: string (nullable = true)
 |    |-- _2: struct (nullable = true)
 |    |    |-- brand_name: string (nullable = true)
 |    |    |-- puk: string (nullable = true)
 |    |-- _3: struct (nullable = true)
 |    |    |-- customer_servicesegment: string (nullable = true)
 |    |    |-- customer_category: string (nullable = true)

La parte del esquema con las columnas (customer_servicesegment, customer_category) debería estar al mismo nivel que aquella con las columnas (brand_name, puk).

Para esto, se puede utilizar la utilidad “explode” de Spark SQL, pero no sé dónde usarla.

Agradecería cualquier ayuda con esto, por favor.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el esquema deseado, puedes utilizar la función struct y alias para crear una nueva columna con la estructura plana necesaria. Aquí tienes un ejemplo de código:

    from pyspark.sql.functions import col, struct
    
    df = df.withColumn("_3", struct(col("_2.customer_servicesegment").alias("customer_servicesegment"), col("_2.customer_category").alias("customer_category")))
    

    En este código, seleccionamos las columnas customer_servicesegment y customer_category de la estructura anidada _2 y utilizamos el método alias para renombrar esas columnas según sea necesario. Luego, utilizamos la función struct para crear una nueva columna con la estructura plana y asignarla al nombre de columna _3.

    ¡Espero que esto te ayude!

Comments are closed.