Spark Scala无法将DataFrame写入XLSX格式问题求助
问题分析
报错java.lang.NoSuchMethodError: org.apache.commons.io.IOUtils.byteArray(I)[B和java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream核心是commons-io依赖版本冲突:Spark(或Glue)环境自带的commons-io版本过低,缺少UnsynchronizedByteArrayOutputStream类及IOUtils.byteArray方法,而com.crealytics.spark.excel依赖更高版本的commons-io。
解决方案
1. 匹配依赖版本并排除冲突
针对Spark Scala 2.12环境,使用对应版本的spark-excel,同时强制指定兼容的commons-io版本,排除环境自带的低版本依赖:
SBT配置示例:
// 适配Spark 2.4+/Scala 2.12的spark-excel版本 libraryDependencies += "com.crealytics" %% "spark-excel" % "0.13.7" exclude("commons-io", "commons-io") // 强制使用spark-excel依赖的commons-io版本(2.11.0为示例,可根据实际依赖树调整) libraryDependencies += "commons-io" % "commons-io" % "2.11.0" force()
Maven配置示例:
<dependency> <groupId>com.crealytics</groupId> <artifactId>spark-excel_2.12</artifactId> <version>0.13.7</version> <exclusions> <exclusion> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> <scope>compile</scope> </dependency>
2. 简化代码配置
代码中同时设置了useHeader和header,其中useHeader是读取Excel时的选项,写入时仅需header即可,删除冗余配置:
df .coalesce(1) .write .format("com.crealytics.spark.excel") .option("header", "true") .mode(SaveMode.Append) .save(s"s3://$bucket/$etlFolderPrefix/a.xlsx")
3. Glue环境额外注意事项
如果是在AWS Glue中运行:
- 确认Glue版本与spark-excel版本兼容(Glue 3.0+对应Spark 3.1+/Scala 2.12,可使用spark-excel 0.14.0+)
- 在Glue作业的"作业参数"中添加
--dependencies指定正确的jar包,或在作业配置中上传兼容的commons-io和spark-excel jar - 确保S3路径的读写权限正常
内容的提问来源于stack exchange,提问作者sangeet singh
相关产品推荐
相关产品推荐

