将JSON文件读入Spark时出现_corrupt_record错误

时间:2016-02-15 12:34:39

标签: python json dataframe pyspark

我有这个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|
|              }|
+---------------+

任何人都知道发生了什么以及为什么它没有正确解释文件?

5 个答案:

答案 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对象。