Pourquoi le message d'erreur “Impossible de trouver le codeur de type stockés dans un jeu de données” lors de l'encodage JSON à l'aide de classes de cas?
J'ai écrit étincelle d'emploi:
object SimpleApp {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Simple Application").setMaster("local")
val sc = new SparkContext(conf)
val ctx = new org.apache.spark.sql.SQLContext(sc)
import ctx.implicits._
case class Person(age: Long, city: String, id: String, lname: String, name: String, sex: String)
case class Person2(name: String, age: Long, city: String)
val persons = ctx.read.json("/tmp/persons.json").as[Person]
persons.printSchema()
}
}
En IDE, quand je lance la fonction principale, 2 erreur se produit:
Error:(15, 67) Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing sqlContext.implicits._ Support for serializing other types will be added in future releases.
val persons = ctx.read.json("/tmp/persons.json").as[Person]
^
Error:(15, 67) not enough arguments for method as: (implicit evidence$1: org.apache.spark.sql.Encoder[Person])org.apache.spark.sql.Dataset[Person].
Unspecified value parameter evidence$1.
val persons = ctx.read.json("/tmp/persons.json").as[Person]
^
mais Spark Shell je peux exécuter cette tâche sans erreur. quel est le problème?
OriginalL'auteur Milad Khajavi | 2016-01-11
Vous devez vous connecter pour publier un commentaire.
Le message d'erreur dit que le
Encoder
n'est pas en mesure de prendre lePerson
cas de la classe.Déplacer la déclaration de la classe de cas en dehors de la portée de
SimpleApp
.J'essaie de comprendre le pourquoi de la portée de la classe de cas est de faire la différence si vous pouvez m'indiquer toutes les ressources que je peux lire et comprendre, il va être d'une grande aide. Assez nouveau avec scala implicite 🙁 @jacek-laskowski
Je ne pense pas que je suis capable d'expliquer pourquoi la solution fonctionne de la manière qu'il le fait. Je me souviens vaguement qu'il n'a rien à voir avec implicites, qui sont tout simplement un mécanisme de brancher un code et pense que le code lui-même est la cause de racine.
OriginalL'auteur
Vous avez le même message d'erreur si vous ajoutez
sqlContext.implicits._
etspark.implicits._
dansSimpleApp
(l'ordre n'a pas d'importance).La suppression de l'une ou l'autre sera la solution:
Testé avec Étincelle 2.1.0
Le plus drôle, c'est que si vous ajoutez le même objet implicites deux fois, vous n'aurez pas de problèmes.
OriginalL'auteur
@Milad Khajavi
Définir de cas de Personne cours à l'extérieur de l'objet SimpleApp.
En outre, ajouter à l'importation sqlContext.implicites._ à l'intérieur de la fonction main ().
OriginalL'auteur