Pyspark: explode json en columna a varias columnas

Los datos se ven así:

+-----------+-----------+-----------------------------+ | id| point| data| +-----------------------------------------------------+ | abc| 6|{"key1":"124", "key2": "345"}| | dfl| 7|{"key1":"777", "key2": "888"}| | 4bd| 6|{"key1":"111", "key2": "788"}| 

Estoy tratando de dividirlo en el siguiente formato.

 +-----------+-----------+-----------+-----------+ | id| point| key1| key2| +------------------------------------------------ | abc| 6| 124| 345| | dfl| 7| 777| 888| | 4bd| 6| 111| 788| 

La función de explode explota el dataframe en varias filas. Pero esa no es la solución deseada.

Nota: Esta solución no responde a mis preguntas. PySpark “explotar” dict en la columna

Siempre que esté utilizando Spark versión 2.1 o superior, pyspark.sql.functions.from_json debería obtener el resultado deseado, pero primero deberá definir el schema requerido.

 from pyspark.sql.functions import from_json, col from pyspark.sql.types import StructType, StructField, StringType schema = StructType( [ StructField('key1', StringType(), True), StructField('key2', StringType(), True) ] ) df.withColumn("data", from_json("data", schema))\ .select(col('id'), col('point'), col('data.*'))\ .show() 

que debería darte

 +---+-----+----+----+ | id|point|key1|key2| +---+-----+----+----+ |abc| 6| 124| 345| |df1| 7| 777| 888| |4bd| 6| 111| 788| +---+-----+----+----+ 

Como lo sugiere @pault, el campo de datos es un campo de string . ya que las claves son las mismas (es decir, ‘key1’, ‘key2’) en la cadena JSON sobre las filas, también puede usar json_tuple() (esta función es nueva en la versión 1.6 según la documentación)

 from pyspark.sql import functions as F df.select('id', 'point', F.json_tuple('data', 'key1', 'key2').alias('key1', 'key2')).show() 

A continuación se encuentra Mi publicación original: lo que probablemente sea MAL si la tabla original es de df.show(truncate=False) y, por lo tanto, el campo de data NO es una estructura de datos de python.

Ya que ha hecho explotar los datos en filas, supongo que los data la columna son una estructura de datos de Python en lugar de una cadena:

 from pyspark.sql import functions as F df.select('id', 'point', F.col('data').getItem('key1').alias('key1'), F.col('data')['key2'].alias('key2')).show()