Pyspark:将列中的json分解为多个列

2024-10-06 12:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

数据是这样的-

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

我试着把它分成以下格式。

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

explode函数将数据帧分解为多行。但这不是理想的解决办法。

注意:这个解决方案不能回答我的问题。 PySpark "explode" dict in column


Tags: 数据函数iddata格式解决方案pysparkpoint
2条回答

正如@pault所建议的,数据字段是一个string字段。由于JSON字符串中的键与行上的键相同(即“key1”、“key2”),因此也可以使用json_tuple()(根据文档,此函数在版本1.6中是新的)

from pyspark.sql import functions as F

df.select('id', 'point', F.json_tuple('data', 'key1', 'key2').alias('key1', 'key2')).show()

下面是我的原始帖子:如果原始表来自df.show(truncate=False),并且data字段不是python数据结构,那么很可能是错误的

因为您已经将数据分解成行,所以我假设列data是一个Python数据结构,而不是一个字符串:

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()

只要您使用的是Spark 2.1或更高版本,^{}应该可以得到您想要的结果,但是您需要首先定义所需的schema

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()

它应该给你

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

相关问题 更多 >