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

如何解决Dataproc 2.2中PySpark Delta任务的NoSuchMethodError报错

问题描述

我在Dataproc 2.2上运行简单PySpark ETL任务,设置任务属性spark.jars.packages为io.delta:delta-core_2.12:2.4.0,其余配置默认。我的Spark配置如下:

conf = (
    SparkConf()
    .set(
        "spark.sql.extensions",
        "io.delta.sql.DeltaSparkSessionExtension",
    )
    .set(
        "spark.sql.catalog.spark_catalog",
        "org.apache.spark.sql.delta.catalog.DeltaCatalog",
    )
    .set(
        "spark.sql.parquet.enableVectorizedReader",
        "false",
    )
)
spark = SparkSession.builder.config(conf=conf).getOrCreate()

执行时出现以下错误:

Traceback (most recent call last):
  File "/tmp/job-b0fc313a/historical.py", line 71, in <module>
    etl(args.source_uri, args.target_uri)
  File "/tmp/job-b0fc313a/historical.py", line 53, in etl
    hist_df.write.format("delta").mode("overwrite").save(target_uri)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 1463, in save
  File "/usr/lib/spark/python/lib/py4j-0.10.9.7-src.zip/py4j/java_gateway.py", line 1322, in __call__
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/errors/exceptions/captured.py", line 179, in deco
  File "/usr/lib/spark/python/lib/py4j-0.10.9.7-src.zip/py4j/protocol.py", line 326, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o89.save.
: java.lang.NoSuchMethodError: 'scala.collection.Seq org.apache.spark.sql.types.StructType.toAttributes()'

我尝试更换io.delta:delta-core_2.x:x.x.0版本无效,已知问题源于Scala版本不兼容,但Dataproc 2.2运行在Scala 2.12上,该如何解决?

解决方案

这个错误的核心是Delta Lake版本与Dataproc 2.2内置的Spark版本不匹配,导致API兼容性问题,并非单纯Scala版本冲突。Dataproc 2.2对应的Spark版本为3.3.x,需匹配对应兼容的Delta版本:

  • 优先使用Dataproc内置Delta组件
    Dataproc 2.2已预装Delta Lake,无需手动通过spark.jars.packages指定版本。直接移除该任务属性配置,即可避免版本冲突,直接使用内置的兼容版本。

  • 手动指定兼容版本(如需自定义)
    若必须手动指定版本,Spark 3.3.x对应的Delta Lake兼容版本为2.3.0(而非你使用的2.4.0)。修改任务属性为:

    spark.jars.packages=io.delta:delta-core_2.12:2.3.0
    
  • 验证配置
    保持原有的SparkSession配置不变,运行任务前可通过以下代码验证Delta版本是否正确:

    spark.sql("SELECT delta_version()").show()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:07:35