SPARK read.json抛出java.io.IOException:换行前的字节太多了

问题描述 投票:3回答:2

我在读取一个大的6gb单行json文件时遇到以下错误:

Job aborted due to stage failure: Task 5 in stage 0.0 failed 1 times, most recent failure: Lost task 5.0 in stage 0.0 (TID 5, localhost): java.io.IOException: Too many bytes before newline: 2147483648

spark没有用新行读取json文件,因此整个6 gb json文件在一行上:

jf = sqlContext.read.json("jlrn2.json")

组态:

spark.driver.memory 20g
json apache-spark pyspark spark-dataframe bigdata
2个回答
6
投票

是的,你的行中有超过Integer.MAX_VALUE字节。你需要拆分它。

请记住,Spark期望每一行都是有效的JSON文档,而不是整个文件。以下是Spark SQL Progamming Guide的相关信息

请注意,作为json文件提供的文件不是典型的JSON文件。每行必须包含一个单独的,自包含的有效JSON对象。因此,常规的多行JSON文件通常会失败。

因此,如果您的JSON文档在表单中......

[
  { [record] },
  { [record] }
]

你会想要改变它

{ [record] }
{ [record] }

0
投票

我在PySpark中读取一个巨大的JSON文件并遇到同样的错误时偶然发现了这一点。所以,如果其他人也想知道如何以PySpark可以正确读取的格式保存JSON文件,这里有一个使用pandas的简单示例:

import pandas as pd
from collections import dict

# create some dict you want to dump
list_of_things_to_dump = [1, 2, 3, 4, 5]
dump_dict = defaultdict(list)
for number in list_of_things_to_dump:
    dump_dict["my_number"].append(number)

# save data like this using pandas, will work of the bat with PySpark
output_df = pd.DataFrame.from_dict(dump_dict)
with open('my_fancy_json.json', 'w') as f:
    f.write(output_df.to_json(orient='records', lines=True))

之后,在PySpark中加载JSON就像:

df = spark.read.json("hdfs:///user/best_user/my_fancy_json.json", schema=schema)
© www.soinside.com 2019 - 2024. All rights reserved.