执行spark.sql删除表时抛出java.lang.NoSuchFieldError: LZ4问题求助
问题描述
执行Spark SQL删除表的代码时抛出NoSuchFieldError: LZ4错误,细节如下:
执行代码
spark.sql("DROP TABLE IF EXISTS " + dbNameString + "." + tableNameString)
报错堆栈
java.lang.NoSuchFieldError: LZ4 at org.apache.spark.sql.execution.datasources.parquet.ParquetOptions$.<init>(ParquetOptions.scala:97) at org.apache.spark.sql.execution.datasources.parquet.ParquetOptions$.<clinit>(ParquetOptions.scala) at org.apache.spark.sql.hive.HiveMetastoreCatalog.convert(HiveMetastoreCatalog.scala:136)
环境与依赖
- Java版本:8
- Maven依赖配置:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.12</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-metastore</artifactId> <version>2.3.9</version> <scope>provided</scope> </dependency>
已尝试操作
- 排查到可能是JAR冲突,当前依赖的lz4版本为1.7.1:
<dependency> <groupId>org.lz4</groupId> <artifactId>lz4-java</artifactId> <version>1.7.1</version> </dependency>
- 尝试将lz4-java升级至1.8.0,问题仍未解决。
解决方案
这个错误由lz4版本不兼容或依赖冲突导致,Spark 3.4.1对lz4-java有明确版本要求,可按以下步骤解决:
- 指定Spark兼容的lz4版本
Spark 3.4.1官方依赖的lz4-java版本为1.9.4,你当前使用的1.7.1/1.8.0版本过低,导致ParquetOptions类无法找到对应LZ4字段。直接在Maven中声明该版本:
<dependency> <groupId>org.lz4</groupId> <artifactId>lz4-java</artifactId> <version>1.9.4</version> </dependency>
- 锁定版本避免冲突
通过dependencyManagement强制锁定lz4-java版本,防止其他依赖引入低版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.lz4</groupId> <artifactId>lz4-java</artifactId> <version>1.9.4</version> </dependency> </dependencies> </dependencyManagement>
- 排查并排除冲突依赖
执行Maven命令查看依赖树,确认是否有其他依赖引入了冲突的lz4版本:
mvn dependency:tree | grep lz4
若发现冲突,在对应依赖中添加排除配置,例如:
<dependency> <!-- 冲突的依赖坐标 --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>org.lz4</groupId> <artifactId>lz4-java</artifactId> </exclusion> </exclusions> </dependency>
- 清理缓存重新构建
执行以下命令删除旧依赖缓存,重新构建项目:
mvn clean install -U
内容的提问来源于stack exchange,提问作者ujjawal
相关产品推荐
相关产品推荐

