【问题标题】:Why would JavaNGramExample fail with "java.lang.ClassNotFoundException: scala.collection.GenTraversableOnce$class"?为什么 JavaNgramExample 会因“java.lang.ClassNotFoundException: scala.collection.GenTraversableOnce$class”而失败?
【发布时间】:2018-05-16 22:30:18
【问题描述】:

我正在 spark 中尝试一个简单的 NGram 示例

https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/ml/JavaNGramExample.java

这是我的 pom 依赖

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.10</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>

下面是示例代码

public class App {
    public static void main(String[] args) {
        System.out.println("Hello World!");

        System.setProperty("hadoop.home.dir", "D:\\del");

         SparkSession spark = SparkSession
                  .builder()
                  .appName("JavaNGramExample").config("spark.master", "local")
                  .getOrCreate();


         List<Row> data = Arrays.asList(RowFactory.create(0, Arrays.asList("car", "killed", "cat")),
                    RowFactory.create(1, Arrays.asList("train", "killed", "cat")),
                    RowFactory.create(2, Arrays.asList("john", "plays", "cricket")),
                    RowFactory.create(3, Arrays.asList("tom", "likes", "mangoes")));


        StructType schema = new StructType(new StructField[] {
                new StructField("id", DataTypes.IntegerType, false, Metadata.empty()),
                new StructField("words", DataTypes.createArrayType(DataTypes.StringType), false, Metadata.empty()) });

        Dataset<Row> wordDataFrame = spark.createDataFrame(data, schema);

        NGram ngramTransformer = new NGram().setN(2).setInputCol("words").setOutputCol("ngrams");

        Dataset<Row> ngramDataFrame = ngramTransformer.transform(wordDataFrame);
        System.out.println(" DISPLAY NGRAMS ");
        ngramDataFrame.select("ngrams").show(false);


    }
}

运行此代码时出现以下错误。

Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class
    at org.apache.spark.sql.types.StructType.<init>(StructType.scala:98)
    at com.mypackage.spark.learnspark.App.main(App.java:61)
Caused by: java.lang.ClassNotFoundException: scala.collection.GenTraversableOnce$class
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more

我检查了scala的依赖,它是scala-library-2.11.8

spark 2.2.0 和我的 scala jars 之间是否存在任何不一致?

【问题讨论】:

    标签: java apache-spark apache-spark-mllib


    【解决方案1】:

    tl;drspark-mllib_2.10 更改为 spark-mllib_2.11,以便将 Scala 2.11.8 用于 Spark MLlib 依赖项(并可选择删除 spark-core_2.11 依赖项)。


    查看您的pom.xml

    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.10</artifactId>
            <version>2.2.0</version>
        </dependency>
    </dependencies>
    
    1. 来自 Spark 2.2.0spark-core_2.11 依赖于 Scala 2.11.8,这没关系。

    2. 来自 Spark 2.2.0spark-mllib_2.10 依赖于两个不同且不兼容的 Scala 版本 2.10.x2.11.8。这就是问题的根本原因。

    请务必使用:

    1. 您的 Spark 依赖项的 artifactId 的后缀相同,即 spark-core_2.11spark-mllib_2.11(请注意,我将其更改为 2.11)。

    2. 每个 Spark 依赖项中的 version 相同。

    【讨论】:

      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2020-10-14
      • 1970-01-01
      • 2012-04-06
      • 2016-06-25
      相关资源
      最近更新 更多