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.

Spark explota en Scala – Añadir una columna explotada a la fila

Tengo un Dataframe de Spark con el siguiente contenido:

Name E1 E2 E3
abc 4 5 6

Necesito que las diferentes columnas de E se conviertan en filas en una nueva columna como se muestra a continuación:

Name value EType
abc 4 E1
abc 5 E2
abc 6 E3

Esta respuesta me dio la idea de usar explode y ahora tengo el siguiente código:

df.select($"Name", explode(array("E1", "E2", "E3")).as("value"))

El código anterior me proporciona las columnas Name y value que necesito, pero aún necesito una forma de agregar la columna EType basada en el valor que se está utilizando para poblar esa fila en particular en el array pasado a explode.

Output del código anterior:

Name value
abc 4
abc 5
abc 6

¿Cómo puedo agregar la columna Etype?

(Estoy usando Spark 2.2 con Scala)

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar la columna EType al Spark Dataframe, puedes utilizar la expresión case junto con la función explode. Aquí está el código modificado:

    import org.apache.spark.sql.functions._
    
    val df2 = df.select($"Name", explode(array(struct(lit("E1").as("EType"), $"E1"),
                                                   struct(lit("E2").as("EType"), $"E2"),
                                                   struct(lit("E3").as("EType"), $"E3")))
                                            .as("temp"))
    
    val finalDf = df2.select($"Name", $"temp.*")
                     .select($"Name", $"col", $"EType")
                     .withColumnRenamed("col", "value")
    
    finalDf.show()
    

    En el código anterior, primero creamos un Spark Dataframe temporario llamado df2 con los valores explotados junto con la columna EType utilizando la función struct.

    Luego seleccionamos las columnas requeridas (Name, col y EType) de df2 y finalmente renombramos la columna col a value. El dataframe resultante finalDf tendrá las columnas requeridas Name, value y EType, como se muestra a continuación:

    Name value EType
    abc 4 E1
    abc 5 E2
    abc 6 E3

    ¡Espero que esto sea de ayuda! Hazme saber si tienes alguna otra pregunta.

Comments are closed.