Extraer columnas de una lista de listas en pyspark

Estoy atrapado intentando extraer columnas de una lista de listas pero no puedo visualizar cómo hacerlo. Soy bastante nuevo para chispear. Pyspark en Spark 2.4.3.

Tengo un json organizado así:

{ "meta" : { ... },
  "data" : 
  [[ "a", 0, null, "{ }"],
   [ "b", 0, null, "{ }"],
   [ "c", 0, null, "{ }"],
   ] }

Quiero conseguir la porción 'data' en columnas, como

 +------+------+------+------+
 | col1 | col2 | col3 | col4 |
 +------+------+------+------+
 |   a  |   0  | None | "{ }"|
 |   b  |   0  | None | "{ }"|
 |   c  |   0  | None | "{ }"|

Tengo mi dataframe read in e printSchema() muestra esto.

root
 |-- data: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: string (containsNull = true)
 |-- meta: struct (nullable = true)
 |    |-- view: struct (nullable = true)
 |    |    |-- approvals: array (nullable = true) ...

Mi forma áspera es de 70 columnas por 650k filas.

Fui capaz de explotar el df para conseguir sólo el data pero estoy atrapado allí.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por devdynamox


4 Respuestas:

  • Explotar las filas primero, y luego seleccionar los elementos del array utilizando [] en Python.

    df2 = df.select(F.explode('data').alias('data')) \
            .select(*[F.col('data')[i].alias('col%s'%(i+1)) for i in range(4)])
    
    df2.show()
    +----+----+----+----+
    |col1|col2|col3|col4|
    +----+----+----+----+
    |   a|   0|null| { }|
    |   b|   0|null| { }|
    |   c|   0|null| { }|
    +----+----+----+----+
    

    Respondida el Dec 18, 2020 a las 03:36 - por codechampion

    Votos positivos: 0 | Votos negativos: 0

  • ¿Por qué no usas el método SparkSession.createDataFrame()?

    https://spark.apache.org/docs/2.4.3/api/python/pyspark.sql.html#pyspark.sql.SparkSession.createDataFrame

    Puede proporcionar datos y parámetros de esquema a este método y obtener el marco de datos de chispa.

    Ejemplo:

    from pyspark.sql import SparkSession
    
    sparkSession = SparkSession.builder.getOrCreate()
    df = sparkSession.createDataFrame(data)
    

    Si la chispa no puede inferir el esquema de los datos, entonces el esquema también debe ser proporcionado

    from pyspark.sql.types import StructType
    
    struct = StructType()
    struct.add("col1", "string", True)
    struct.add("col2", "integer", True)
    struct.add("col3", "string", True)
    struct.add("col4", "string", True)
    
    
    df = sparkSession.createDataFrame(data=data, schema=struct)
    

    Además, puede utilizar clases tipo pyspark en lugar de nombres de tipo python primitivo. https://spark.apache.org/docs/2.4.3/api/python/pyspark.sql.html#module-pyspark.sql.types

    módulo contiene ambos tipos simples (Tipo de cuerda, IntegerType, ...) y tipos complejos (ArrayType, MapType, ...)

    Última nota: los datos no pueden contener null, debe ser None en pitón. chispa DataFrame.show() imprimirá None columnas como null.

    Respondida el Dec 18, 2020 a las 03:41 - por codecrusaderx58e2

    Votos positivos: 0 | Votos negativos: 0

  • Para extraer columnas de una lista de listas en PySpark, puedes usar la función explode() para convertir el array de arrays en filas. Luego puedes usar la función getItem() para extraer los elementos de cada lista y crear las columnas correspondientes.

    Aquí hay un ejemplo de cómo hacerlo en PySpark: ```python from pyspark.sql import SparkSession from pyspark.sql.functions import col, expr

    spark = SparkSession.builder.appName("Example").getOrCreate()

    Suponiendo que ya tienes tu DataFrame df con la estructura mencionada

    df.printSchema()

    Convertir el array de arrays en filas

    dfexploded = df.selectExpr("inlineouter(data)")

    Extraer los elementos de cada lista y crear las columnas

    dffinal = dfexploded.select( col("col")[0].alias("col1"), col("col")[1].alias("col2"), col("col")[2].alias("col3"), col("col")[3].alias("col4") )

    Mostrar el DataFrame final

    df_final.show() ```

    En este código, estamos haciendo lo siguiente:

    • Utilizamos `selectExpr("inline_outer(data)")` para convertir el array de arrays en filas.
    • Luego, utilizamos `col("col")[index].alias("nombre_columna")` para extraer los elementos de cada lista y asignarles un nombre de columna.
    • Finalmente, creamos un nuevo DataFrame `df_final` con las columnas extraídas y lo mostramos utilizando `show()`.

    Este código debería ayudarte a extraer las columnas de tu lista de listas en PySpark y visualizar los datos como lo deseas.

    Respondida el Dec 19, 2020 a las 03:37 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para extraer columnas de una lista de listas en PySpark, puedes utilizar la función explode para convertir la lista de listas en filas individuales y luego utilizar la función array_join para concatenar los elementos de cada lista en una sola columna.

    Aquí tienes un ejemplo de cómo puedes hacerlo:

    python
    from pyspark.sql import functions as F
    
    

    Lee el JSON como un DataFrame

    df = spark.read.json("path/to/data.json")

    Explota la columna "data" para obtener una fila por elemento de la lista

    df = df.withColumn("exploded_data", F.explode("data"))

    Convierte la lista de elementos en una columna concatenada

    df = df.withColumn("columns", F.array_join("exploded_data", ","))

    Selecciona las columnas deseadas

    df = df.select("columns")

    El DataFrame df contendrá una columna llamada "columns" que contiene los elementos de cada lista de "data" concatenados en una sola cadena. Puedes dividir esta columna en columnas separadas utilizando la función split de la siguiente manera:

    python
    

    Divide la columna "columns" en columnas individuales

    df = df.withColumn("col1", F.split("columns", ",").getItem(0)) df = df.withColumn("col2", F.split("columns", ",").getItem(1)) df = df.withColumn("col3", F.split("columns", ",").getItem(2)) df = df.withColumn("col4", F.split("columns", ",").getItem(3))

    El DataFrame df contendrá ahora las columnas individuales que deseas.

    Respondida el Dec 19, 2020 a las 03:40 - por Gemini

    Votos positivos: 0 | Votos negativos: 0