我有这个JSON文件
{
"a": 1,
"b": 2
}
是用Python json.dump方法获得的。 现在,我想使用pyspark将此文件读入Spark中的DataFrame。以下文档,我正在做这个
sc = SparkContext()
sqlc = SQLContext(sc)
df = sqlc.read.json(' my_file.json')
print df.show()
print语句虽然吐出了这个:
+---------------+
|_corrupt_record|
+---------------+
| {|
| "a": 1, |
| "b": 2|
| }|
+---------------+
任何人都知道发生了什么以及为什么它没有正确解释文件?
答案 0 :(得分:40)
输入文件中每行需要一个json对象,请参阅http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader.json
如果您的json文件看起来像这样,它将为您提供预期的数据帧:
{ "a": 1, "b": 2 }
{ "a": 3, "b": 4 }
....
df.show()
+---+---+
| a| b|
+---+---+
| 1| 2|
| 3| 4|
+---+---+
答案 1 :(得分:23)
如果您想保留JSON文件(不删除换行符\n
),请添加multiLine=True
关键字参数
sc = SparkContext()
sqlc = SQLContext(sc)
df = sqlc.read.json('my_file.json', multiLine=True)
print df.show()
答案 2 :(得分:3)
添加@ Bernhard的优秀答案
# original file was written with pretty-print inside a list
with open("pretty-printed.json") as jsonfile:
js = json.load(jsonfile)
# write a new file with one object per line
with open("flattened.json", 'a') as outfile:
for d in js:
json.dump(d, outfile)
outfile.write('\n')
答案 3 :(得分:3)
在Spark 2.2+中,您可以使用以下命令读取多行的json文件。
val dataframe = spark.read.option("multiline",true).json( " filePath ")
如果每行有json对象,那么
val dataframe = spark.read.json(filepath)
答案 4 :(得分:0)
我想分享一下我的经验,我有一个JSON列字符串,但使用Python表示法,这意味着我有None
而不是null
,是False
而不是{{1} }和false
,而不是True
。
解析此列时,spark返回一个名为true
的列。因此,在解析JSON字符串之前,我要做的就是用标准的JSON表示法替换Python表示法:
_corrupt_record
此转换之后,我可以使用df.withColumn("json_notation",
F.regexp_replace(F.regexp_replace(F.regexp_replace("_corrupt_record", "None", "null"), "False", "false") ,"True", "true")
列上的函数F.from_json()
,在这里Pyspark可以正确解析JSON对象。