目前我正在解析我的 Json feed:
rdd = self.spark.sparkContext.parallelize([(json_feed)])
df = self.spark.read.json(rdd)
只要值都在那里,就可以正常工作,但是如果我有一个 Json (作为 Python 字典),例如:
json_feed = { 'name': 'John', 'surname': 'Smith', 'age': None }
我想在
null
列上获取具有值 age
的生成的 DataFrame,但我目前得到的是 _corrupt_record
。有没有办法用 Pyspark 将 None
值解析为 null
?
Spark 导入缺失值的 JSON 受到很大限制。一个简单的解决方法是将文件作为文本读取并使用所需的架构进行解析。
假设 JSON 缺少“年龄”字段:
!cat /content/sample_data/test.json
{ "name": "John", "surname": "Smith" }
首先,以文本形式读取文件,然后使用所需的架构从中创建数据框:
rdd = spark.sparkContext.textFile("/content/sample_data/test.json").map(eval)
df = spark.createDataFrame(data=rdd, schema="name string, surname string, age int")
df.show(truncate=False)
+----+-------+----+
|name|surname|age |
+----+-------+----+
|John|Smith |null|
+----+-------+----+
df.printSchema()
root
|-- name: string (nullable = true)
|-- surname: string (nullable = true)
|-- age: integer (nullable = true)
您可以先将 json dict 读入 pandas dataframe,然后转换为 Spark dataframe。如果[json_feed]有多条记录且age列不全为null,则可以跳过Schema参数(如果全为null,spark无法推断类型)。如果架构与现有 Spark 数据帧相同,则可以从该数据帧中提取它,请参阅将架构从一个数据帧复制到另一个数据帧
import pandas as pd
json_feed = { 'name': 'John', 'surname': 'Smith', 'age': None }
pdf=pd.DataFrame.from_records([json_feed])
df = spark.createDataFrame(pdf,schema="name string, surname string, age INT")
df.show()
+----+-------+----+
|name|surname| age|
+----+-------+----+
|John| Smith|null|
+----+-------+----+