Spark Session 2.2读取HDFS中Excel文件报错求助
解决Spark 2.2加载Excel时的NoSuchMethodError问题
这个NoSuchMethodError十有八九是POI依赖版本冲突导致的——Spark 2.2自带的POI版本和com.crealytics.spark.excel库依赖的POI版本不匹配,或者缺少了必要的POI扩展包。下面给你一步步解决的方案:
1. 确保使用适配Spark 2.2的spark-excel版本
Spark 2.2对应的spark-excel稳定版本是0.11.1,这个版本专门适配Spark 2.x系列,不要用更高版本(比如0.12+可能只支持Spark 3.x了)。
Maven依赖配置
<dependency> <groupId>com.crealytics</groupId> <artifactId>spark-excel_2.11</artifactId> <!-- 注意Scala版本,Spark 2.2一般搭配Scala 2.11 --> <version>0.11.1</version> </dependency>
SBT依赖配置
libraryDependencies += "com.crealytics" %% "spark-excel" % "0.11.1"
2. 排除Spark自带的冲突POI依赖
Spark本身会内置旧版POI,会和spark-excel需要的版本冲突,所以要在构建工具里排除这些冲突依赖:
Maven排除示例
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.2.0</version> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> </exclusion> </exclusions> </dependency>
3. 优化你的加载代码
你代码里同时设置了location参数和load(pathFile),其实这两个是重复的,只需要保留一个即可,比如简化成:
Dataset<Row> df = session.read() .format("com.crealytics.spark.excel") .option("sheetName", "Feuil1") .option("useHeader", "true") .option("treatEmptyValuesAsNulls", "true") .option("inferSchema", "true") .option("addColorColumns", "false") .load("hdfs://your-namenode:9000/path/to/your/file.xlsx"); // 确保HDFS路径格式正确
注意HDFS路径要写完整,比如hdfs://namenode-host:port/xxx/xxx.xlsx,不要只写相对路径。
4. 打包时包含依赖(如果是提交集群运行)
如果是打包成JAR提交到Spark集群,要确保把spark-excel和POI的依赖都打包进去(可以用Maven的assembly-plugin或者SBT的sbt-assembly),避免集群节点缺少依赖。
按照这个步骤来,应该就能解决那个NoSuchMethodError的问题了。
内容的提问来源于stack exchange,提问作者OOvic
相关产品推荐
相关产品推荐

