我在 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>