Pyspark将JSON对象列拆分为多列

Posted

技术标签:

【中文标题】Pyspark将JSON对象列拆分为多列【英文标题】:Pyspark split array of JSON objects column to multiple columns 【发布时间】:2021-06-30 11:11:42 【问题描述】:

我有一个 pyspark 数据框,其中一列的格式如下:

[key1: value1,key2:value2, key3:value3, key4:value4]

让我们将其称为 ColumnY,如下所示:

ColumnY
[key1: value1,key2:value2, key3:value3, key4:value4]

我想将其转换为数据框的列,其中列名为 keyX,其内容为 valueX,其中 X=[1,4] 如下:

key 1 key 2 key 3 key 4
value1 value2 value3 value4

我尝试了一些解决方案,但没有奏效。如果有的话,请您分享任何想法或解决方案。提前谢谢你。

【问题讨论】:

【参考方案1】:

这是一个格式非常糟糕的 JSON,没有任何引号,但您仍然可以通过蛮力解析它:

import pyspark.sql.functions as F

df2 = df.selectExpr("""
    explode(
        transform(
            split(ColumnY, ','), 
            x -> str_to_map(regexp_replace(x, '[\\\\[\\\\ \\\\]\\\\]', ''), ' ', ':')
        )
    ) as col
""").select(F.explode('col')).groupBy().pivot('key').agg(F.first('value'))

df2.show()
+------+------+------+------+
|  key1|  key2|  key3|  key4|
+------+------+------+------+
|value1|value2|value3|value4|
+------+------+------+------+

【讨论】:

以上是关于Pyspark将JSON对象列拆分为多列的主要内容,如果未能解决你的问题,请参考以下文章

将包含 json 数据的 pandas 数据框的列拆分为多列

PySpark 将 JSON 字符串分解为多列

将列表的列拆分为同一 PySpark 数据框中的多列

在pyspark中将字典列拆分为多列

pySpark - 在插入数据库之前将整个数据框列转换为 JSON 对象

在 pyspark 的 StructStreaming 中;如何将 DataFrame 中的每一行(json 格式的字符串)转换为多列