我有一个不能被火花读懂的json (spark.read.json("xxx").show())
{'event_date_utc': None,'deleted': False, 'cost':1 , 'name':'Mike'}
问题似乎是“无”和“假”不在单引号下,seems不能将它们默认为布尔、null或偶数字符串。
我尝试给我的spark读取一个模式,而不是通过强制这2列为字符串并具有相同的错误来推断。
对我来说,spark试图先读取数据,然后应用模式,然后在读取部分失败。
有没有一种不修改输入数据就能告诉spark读取这些值的方法?我在用蟒蛇。
发布于 2021-02-04 21:14:38
输入不是有效的JSON,因此不能使用spark.read.json读取它。相反,您可以使用DataFrame将其作为文本spark.read.text加载,并使用UDF将字符串化的dict解析为json:
import ast
import json
from pyspark.sql import functions as F
from pyspark.sql.types import *
schema = StructType([
StructField("event_date_utc", StringType(), True),
StructField("deleted", BooleanType(), True),
StructField("cost", IntegerType(), True),
StructField("name", StringType(), True)
])
dict_to_json = F.udf(lambda x: json.dumps(ast.literal_eval(x)))
df = spark.read.text("xxx") \
.withColumn("value", F.from_json(dict_to_json("value"), schema)) \
.select("value.*")
df.show()
#+--------------+-------+----+----+
#|event_date_utc|deleted|cost|name|
#+--------------+-------+----+----+
#|null |false |1 |Mike|
#+--------------+-------+----+----+发布于 2021-02-04 20:31:24
JSON看起来不太好。字段值需要引用。
您可以首先eval行,这些行看起来是Python格式的。
df = spark.createDataFrame(
sc.textFile('true.json').map(eval),
'event_date_utc boolean, deleted boolean, cost int, name string'
)
df.show()
+--------------+-------+----+----+
|event_date_utc|deleted|cost|name|
+--------------+-------+----+----+
| null| false| 1|Mike|
+--------------+-------+----+----+https://stackoverflow.com/questions/66053285
复制相似问题