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

AWS Glue定宽转Parquet时PySpark报StackOverflowError如何解决

问题原因
  • 核心触发点是循环调用1600次withColumn方法,导致Spark的Catalyst优化器生成的逻辑计划嵌套层级过深,优化阶段递归遍历计划树时直接触发栈溢出,和数据量、缓存/重分区逻辑无关,500列时可以正常运行是因为嵌套深度未超过栈的默认承载上限。
解决方案

方案1:重构列生成逻辑,避免嵌套逻辑计划(优先选择,无额外资源开销)

不要循环调用withColumn,而是一次性构造所有列的提取表达式,通过select方法批量生成列,从根源上避免计划树嵌套过深。
修改后的代码示例:

import pyspark.sql.functions as F

data_df = spark.read.text(input_path) 
schema_df = pd.read_json(schema_path)

# 构造所有列的提取表达式列表
select_cols = [F.col("value")]
for r in schema_df.itertuples():
    select_cols.append(
        F.substring(F.col("value"), int(r.start), int(r.length)).alias(str(r.name))
    )

# 一次性select所有列,再删除原始value列
df = data_df.select(select_cols).drop("value")

df.write.mode("overwrite").option("compression", "gzip").parquet(output_path)

方案2:调大Spark栈内存(兼容原有代码的临时方案)

如果不想修改业务代码,可以在AWS Glue作业的配置参数中新增以下配置,提升驱动和执行器的栈内存上限:

  • 作业参数键:--conf,值:spark.driver.extraJavaOptions=-Xss4m
  • 作业参数键:--conf,值:spark.executor.extraJavaOptions=-Xss4m
    如果1600列4M内存不够可以调整到8M,不过该方案只是绕开问题,列数继续上升还是会触发报错,优先选择方案1。

内容的提问来源于stack exchange,提问作者SandeepNavale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:36:04