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()?
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 serNone
en pitón. chispa DataFrame.show() imprimiráNone
columnas comonull
.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óngetItem()
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.printSchema()df
con la estructura mencionadaConvertir 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ónarray_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ónsplit
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