使用Spark读取100MB单行JSON文件时触发java.lang.OutOfMemoryError
问题分析与解决方法
问题根源
核心问题出在单行大JSON文件的处理逻辑上:
- Spark默认按行拆分JSON数据,你的100MB文件是单个完整JSON对象(单行),会被分配到单个Executor的内存分区中。
- Spark自动推断Schema时,需要将整个JSON对象完整加载到内存中解析结构,超出了默认Java堆内存的限制,因此抛出
java.lang.OutOfMemoryError: Java heap space错误。 - 另外原代码末尾的
spark.close是错误写法,正确的关闭方法是spark.stop()。
解决方法
1. 增加Spark Java堆内存
在创建SparkSession时,显式配置Driver内存(local模式下Driver与Executor共用同一进程,只需配置Driver内存):
from pyspark.sql import SparkSession spark = SparkSession.builder \ .master("local[*]") \ .appName("test - python") \ .config("spark.driver.memory", "2g") # 可根据实际需求调整为1g/3g等 .getOrCreate() df = spark.read.json("file.json") df.show() spark.stop()
2. 提前指定Schema,跳过自动推断
自动推断Schema需要加载整个JSON文件到内存解析,提前定义Schema可以让Spark流式处理数据,无需加载完整文件:
from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType # 替换为你实际的JSON结构 custom_schema = StructType([ StructField("id", IntegerType(), nullable=True), StructField("username", StringType(), nullable=True), # 添加其他对应字段 ]) spark = SparkSession.builder \ .master("local[*]") \ .appName("test - python") \ .getOrCreate() df = spark.read.schema(custom_schema).json("file.json") df.show() spark.stop()
3. (可选)针对JSON数组启用多行模式
如果你的单行JSON是数组格式(如[{"key1":val1}, {"key2":val2}]),可以启用多行模式让Spark解析数组内的每个元素:
df = spark.read.option("multiLine", "true").json("file.json")
内容的提问来源于stack exchange,提问作者Renato C Domingues
相关产品推荐
相关产品推荐

