使用 json 字符串值和模式创建 pyspark 数据框

Posted

技术标签:

【中文标题】使用 json 字符串值和模式创建 pyspark 数据框【英文标题】:create pyspark dataframe with json string values and schema 【发布时间】:2021-02-19 00:24:45 【问题描述】:

我正在尝试手动创建一些虚拟 pyspark 数据框。

我做了以下事情:

from pyspark.sql.types import StructType,StructField, StringType, IntegerType
data2 = [('"Time":"2020-08-01T08:14:20.650Z","version":null')
            ]

schema = StructType([ \
    StructField("raw_json",StringType(),True)
  ])

df = spark.createDataFrame(data=data2,schema=schema)
df.printSchema()
df.show(truncate=False)

但我得到了错误:

TypeError: StructType can not accept object '["Time:"2020-08-01T08:14:20.650Z","version":null]' in type <class 'str'>

如何将 json 字符串作为值放入 pyspark 数据框中?

我的理想结果是:

+-----------------------------------------------------------------+
|value                                                             |             
+-----------------------------------------------------------------------
| "Time":"2020-08-01T08:14:20.650Z","version":null|

【问题讨论】:

【参考方案1】:

错误是因为你的大括号。 data2 应该有列表列表 - 所以用方括号替换内括号:

data2 = [['"applicationTimeStamp":"2020-08-01T08:14:20.650Z","version":null']]

schema = StructType([StructField("raw_json",StringType(),True)])
df = spark.createDataFrame(data=data2,schema=schema)

df.show(truncate=False)
+------------------------------------------------------------------+            
|raw_json                                                          |
+------------------------------------------------------------------+
|"applicationTimeStamp":"2020-08-01T08:14:20.650Z","version":null|
+------------------------------------------------------------------+

【讨论】:

【参考方案2】:

如果您将 data2 指定为元组列表,它也可以工作,方法是在括号内添加一个尾随逗号以指定它是一个元组。

from pyspark.sql.types import *

# Note the trailing comma inside the parentheses
data2 = [('"applicationTimeStamp":"2020-08-01T08:14:20.650Z","version":null',)]

schema = StructType([
    StructField("raw_json",StringType(),True)
])

df = spark.createDataFrame(data=data2,schema=schema)
df.show(truncate=False)
+------------------------------------------------------------------+
|raw_json                                                          |
+------------------------------------------------------------------+
|"applicationTimeStamp":"2020-08-01T08:14:20.650Z","version":null|
+------------------------------------------------------------------+

【讨论】:

【参考方案3】:

试试这个:

import json

rdd = sc.parallelize(data2).map(lambda x: [json.loads(x)]).toDF(schema=['raw_json'])

【讨论】:

以上是关于使用 json 字符串值和模式创建 pyspark 数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 解析 JSON 时嵌套动态模式不起作用

如何解析 pyspark 的 DataStreamReader 中的 json 字符串列并创建数据框

从 PySpark GroupBy 中的两列创建 JSON 字符串

如何在pyspark中将JSON字符串转换为JSON对象

使用 pyspark 中 json 文件中的模式读取固定宽度文件

使用作为 JSON 文件提供的模式创建数据框