使用Apache Avro读取Parquet文件报java.lang.NoSuchFieldError: NULL_VALUE错误如何解决
这个java.lang.NoSuchFieldError: NULL_VALUE属于典型的Parquet版本依赖冲突问题。你单独运行Scala文件正常,是因为单文件运行时类路径下只有一套兼容的Parquet与Avro依赖,集成到项目后出现多版本冲突:Alpakka AvroParquet 3.0.3依赖的Parquet版本,和你本地引入的raphtory.jar中内置的Parquet版本不兼容,低版本Parquet的AvroSchemaConverter类不存在NULL_VALUE静态字段,运行时类加载器优先加载了低版本类就会触发该报错。
解决步骤如下:
- 先排查当前项目的依赖版本:在项目根目录执行
sbt dependencyTree | grep parquet,筛选所有org.apache.parquet相关依赖的版本,确认不同组件拉取的版本差异。 - 强制统一Parquet版本:在build.sbt中添加版本锁定配置,Alpakka 3.0.3适配的Parquet版本为1.12.x,直接锁定即可:
dependencyOverrides ++= Seq( "org.apache.parquet" % "parquet-avro" % "1.12.0", "org.apache.parquet" % "parquet-hadoop" % "1.12.0" )
- 排除冗余依赖:如果确认是
raphtory.jar内置了旧版Parquet,可以选择两种方案:一是将raphtory内部的Parquet依赖调整为provided scope后重新打包jar,二是在Alpakka依赖中排除传递引入的Parquet组件,改用raphtory内置的版本。 - 额外校验:如果调整依赖后仍然报错,确认你读取的Parquet文件的生成版本,要和项目中最终使用的Parquet版本保持一致,避免读写版本不兼容的问题。
内容的提问来源于stack exchange,提问作者Oonah
相关产品推荐
相关产品推荐

