无法在本地运行Amazon Deequ示例

问题描述

我试图在本地运行和测试Amazon Deequ库,但是对于各种示例,我一直在反复获取类未找到错误。确切的错误

    java.lang.NoClassDefFoundError: scala/Product$class
  at com.amazon.deequ.profiles.ColumnProfilerRunBuilderFileOutputoptions.<init>(ColumnProfilerRunner.scala:31)
  at com.amazon.deequ.profiles.ColumnProfilerRunBuilder.run(ColumnProfilerRunBuilder.scala:174)
  ... 47 elided
Caused by: java.lang.classNotFoundException: scala.Product$class
  at java.base/java.net.urlclassloader.findClass(urlclassloader.java:466)
  at java.base/java.lang.classLoader.loadClass(ClassLoader.java:566)
  at java.base/java.lang.classLoader.loadClass(ClassLoader.java:499)
  ... 49 more

val suggestionResult = ConstraintSuggestionRunner().onData(input).addConstraintRules(Rules.DEFAULT).run()
java.lang.NoClassDefFoundError: scala/Product$class
  at com.amazon.deequ.suggestions.rules.CompleteIfCompleteRule.<init>(CompleteIfCompleteRule.scala:25)
  at com.amazon.deequ.suggestions.Rules$.<init>(ConstraintSuggestionRunner.scala:33)
  at com.amazon.deequ.suggestions.Rules$.<clinit>(ConstraintSuggestionRunner.scala)
  ... 49 elided

我遵循的代码是我使用spark-submit --class --packages com.amazon.deequ:deequ:1.0.4

的示例中给出的代码

我还尝试使用spark-shell --jars并尝试逐行运行,但仍得到相同的结果

解决方法

此问题与deequ无关,但可能是由于Scala版本错误引起的。 deequ目前仅支持Scala 2.11。请确保您使用的版本正确。

有关更多详细信息,请参见此答案NoClassDefFoundError: scala/Product$class

,

您使用的Deequ版本不适用于Scala 2.12编译的Spark 3.0,因此会导致此错误(由Philipp指出)。因此,您有两种可能的解决方案:

  1. 使用与Deequ 1.0.4兼容的Spark 2.4.x
  2. 使用以下命令mvn clean install -DskipTests -Pscala-2.12 -Pspark-3.0sources编译Deequ,然后可以将其与spark-shell一起使用:bin/spark-shell --jars <path-to-deequ-checkout>/target/deequ_2.12-1.1.0-SNAPSHOT.jar(很遗憾,我们不能使用--packages由于Maven中的构建问题)

P.S。最好抓住最新的Spark-> 3.0.1-预览版发布时间太久了