Je rencontre un problème lors de l'utilisation de spark.ml.util.SchemaUtils sur Spark v1.6.0. Je reçois l'erreur suivante:Méthode erreur inconnue sur le cluster, fonctionne localement - les deux versions d'étincelles sont identiques
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)
lors de l'exécution cet exemple minimal sur mon groupe (inspiré par le library Je veux finalement utiliser):
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())
}
}
Cependant, le même exemple lancé sur mon bureau local fonctionne sans problèmes. De ce que j'ai vu en ligne (par exemple here), ce type de message d'erreur est souvent lié à une incompatibilité de version entre environnement de compilation et environnement d'exécution, mais mon programme, ma distribution d'étincelles locale et ma distribution de cluster ont tous Spark & mllib versions v1.6.0, la même version Scala v2.10.6, et la même version Java v7.
J'ai vérifié le code source de Spark 1.6.0 et l'appendColumn existe dans org.apache.spark.ml.util.SchemaUtils, avec la bonne signature (mais SchemaUtils n'est pas mentionné dans org.apache.spark.ml documentation API .util).
ETA: Extrait de mon fichier 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>
Les fichiers conf de mon étincelle locale sont vides et l'onglet Environnements de l'interface utilisateur Spark sur le cluster n'affiche aucun paramètre pour ClassPath, donc je suppose que les deux versions utilisent les valeurs par défaut. Mon emballage semble également avoir les bonnes versions pour tous (j'ai ajouté les dépendances pom à mon OP). – datasock