[英]SPARK read.json throwing java.io.IOException: Too many bytes before newline
我在读取一个大的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
是的,你的行中有超过Integer.MAX_VALUE
个字节。 你需要拆分它。
请记住,Spark期望每一行都是有效的JSON文档,而不是整个文件。 以下是Spark SQL Progamming Guide中的相关行
请注意,作为json文件提供的文件不是典型的JSON文件。 每行必须包含一个单独的,自包含的有效JSON对象。 因此,常规的多行JSON文件通常会失败。
因此,如果您的JSON文档在表单中......
[
{ [record] },
{ [record] }
]
你会想要改变它
{ [record] }
{ [record] }
我在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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.