在Google Dataproc集群处理Excel文件时遭遇java.lang.NoSuchMethodError错误
Dataproc集群读取Excel文件时出现java.lang.NoSuchMethodError错误
在Dataproc集群中读取Excel文件时触发java.lang.NoSuchMethodError,Schema可正常打印,但无法获取实际数据。
错误详情
py4j.protocol.Py4JJavaError: An error occurred while calling o74.showString. : java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps; at com.crealytics.spark.excel.ExcelRelation.buildScan(ExcelRelation.scala:74)
相关代码
from pyspark.sql import SparkSession from pyspark import SparkConf, SparkContext from google.cloud import storage from google.cloud import bigquery import pyspark client = storage.Client() bucket_name = "test_bucket" path=f"gs://{bucket_name}/test_file.xlsx" def make_spark_session(app_name, jars=[]): configuration = (SparkConf() .set("spark.jars", ','.join(jars))) spark = SparkSession.builder.appName(app_name) \ .config(conf=configuration).getOrCreate() return spark app_name = 'test_app' jars = ['gs://bucket/spark-excel_2.11_uber-0.12.0.jar'] spark = make_spark_session(app_name,jars) df = spark.read.format("com.crealytics.spark.excel") \ .option("useHeader","true") \ .load(path) df.show(1)
解决方案
这个错误的核心是Scala版本不兼容:你使用的spark-excel_2.11_uber-0.12.0.jar基于Scala 2.11编译,但Dataproc集群(尤其是2.0及以上版本)默认使用Scala 2.12,导致跨版本方法调用失败。
解决步骤:
- 确认集群的Scala版本:在集群节点执行
spark-submit --version,输出中会显示Scala版本。 - 替换对应版本的spark-excel jar包:
- 如果集群用Scala 2.12,改用
spark-excel_2.12_uber-0.12.0.jar(或匹配集群Spark版本的更高兼容版本,比如Spark 3.x对应spark-excel 0.13.x及以上)
- 如果集群用Scala 2.12,改用
- 更新代码中的jar路径:将
jars = ['gs://bucket/spark-excel_2.11_uber-0.12.0.jar']替换为对应版本的jar存储路径。
额外建议:创建Dataproc集群时,可以通过--properties spark.jars.packages=com.crealytics:spark-excel_2.12:0.13.7(替换为对应版本)的方式自动拉取兼容依赖,避免手动管理jar包版本。
内容的提问来源于stack exchange,提问作者kmr
相关产品推荐
相关产品推荐

