You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:01:22