如何解决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
相关产品推荐
相关产品推荐

