将JSON文件读取到Spark时出现_Corrupt_Record错误

h7wcgrx3  于 2022-09-21  发布在  Spark
关注(0)|答案(6)|浏览(250)

我有这个JSON文件

{
    "a": 1, 
    "b": 2
}

它是通过Python json.ump方法获得的。现在,我想使用pyspark将此文件读取到Spark中的DataFrame中。根据文档,我正在执行以下操作

Sc=SparkContext()

Sqlc=SQLContext(Sc)

Df=sqlc.read.json(‘my_file.json’)

打印df.show()

不过,PRINT语句给出了以下内容:

+---------------+
|_corrupt_record|
+---------------+
|              {|
|       "a": 1, |
|         "b": 2|
|              }|
+---------------+

有人知道发生了什么吗?为什么它不能正确解释文件?

cbjzeqam

cbjzeqam1#

如果希望JSON文件保持原样(不删除新行字符\n),请包含multiLine=True关键字参数

sc = SparkContext() 
sqlc = SQLContext(sc)

df = sqlc.read.json('my_file.json', multiLine=True)

print df.show()
uttx8gqw

uttx8gqw2#

您的输入文件中每行需要有一个JSON对象,请参见http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader.json

如果您的json文件如下所示,它将为您提供预期的 Dataframe :

{ "a": 1, "b": 2 }
{ "a": 3, "b": 4 }

....
df.show()
+---+---+
|  a|  b|
+---+---+
|  1|  2|
|  3|  4|
+---+---+
wmomyfyw

wmomyfyw3#

在Spark 2.2+中,你可以使用以下命令读取多行的json文件。

val dataframe = spark.read.option("multiline",true).json( " filePath ")

如果每行有JSON对象,

val dataframe = spark.read.json(filepath)
ahy6op9u

ahy6op9u4#

补充@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')
oo7oh9g9

oo7oh9g95#

我想分享我的经验,其中我使用了JSON列字符串,但使用了Python表示法,这意味着我使用None而不是nullFalse而不是falseTrue而不是true

在解析该列时,Spark向我返回一个名为_corrupt_record的列。因此,在解析JSON字符串之前,我必须做的是用标准的JSON表示法替换Python表示法:

df.withColumn("json_notation",
    F.regexp_replace(F.regexp_replace(F.regexp_replace("_corrupt_record", "None", "null"), "False", "false") ,"True", "true")

在此转换之后,例如,我可以在json_notation列上使用函数F.from_json(),在这里,Pyspark能够正确地解析JSON对象。

8wtpewkr

8wtpewkr6#

发生这种情况的另一个原因可能是文件编码。比方说,如果您正在阅读的文件是拉丁文编码的,您将会遇到这个问题。在读取文件时尝试使用.Option(“编码”,“cp1252”)。这为我解决了问题

相关问题