0

我在 Spark v1.6.0 上使用 spark.ml.util.SchemaUtils 时遇到问题。我收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.ml.util.SchemaUtils$.appendColumn(Lorg/apache/spark/sql/types/StructType;Ljava/lang/String;Lorg/apache/spark/sql/types/DataType;)Lorg/apache/spark/sql/types/StructType;
        at org.apache.spark.ml.SchemaTest$.main(SchemaTest.scala:17)

在我的集群上运行这个最小示例时(受我最终想要使用的库的启发):

package org.apache.spark.ml

import org.apache.spark.ml.util.SchemaUtils
import org.apache.spark.sql.types._
import org.apache.spark.mllib.linalg.VectorUDT

object SchemaTest {

  def main(args: Array[String]): Unit = {
    val schema: StructType =
      StructType(
        StructField("a", IntegerType, true) :: StructField("b", LongType, false) :: Nil
      )

    val transformed = SchemaUtils.appendColumn(schema, "test", new VectorUDT())

  }
}

但是,在我的桌面上本地启动的相同示例运行没有问题。

从我在网上看到的(例如这里),这种错误消息通常与编译和运行时环境之间的版本不匹配有关,但是我的程序、我的本地 spark 分发和我的集群分发都有相同的 Spark 和 mllib 版本v1.6.0,相同的 Scala 版本 v2.10.6,和相同的 Java 版本 v7。

我检查了 Spark 1.6.0 源代码,并且在 org.apache.spark.ml.util.SchemaUtils 中确实存在 appendColumn,并且具有正确的签名(但是 org.apache.spark.ml.util API 文档中没有提到 SchemaUtils )。

ETA:从我的 pom.xml 文件中提取:

 <dependencies>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.10.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>1.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.10</artifactId>
        <version>1.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.10</artifactId>
        <version>1.6.0</version>
        <scope>provided</scope>
    </dependency>

</dependencies>
4

1 回答 1

0

您需要检查所有可以更改集群上运行的作业的类路径的位置。例如,这些属性:

  • spark.driver.extraClassPath
  • spark.driver.userClassPathFirst
  • spark.executor.extraClassPath
  • spark.executor.userClassPathFirst

您还应该检查您的组装过程,以确保您认为要打包的依赖项实际上就是您要打包的。

于 2017-03-16T17:30:49.047 回答