2016-01-11 14 views
9

ho scritto:Perché l'errore "Impossibile trovare l'encoder per il tipo memorizzato in un set di dati" durante la codifica JSON utilizzando le classi di casi? lavoro scintilla

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() 
    } 
} 

In IDE quando si esegue la funzione principale, 2 errore si verifica:

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] 
                   ^

ma in Spark Shell posso correre questo lavoro senza alcun errore. qual è il problema?

risposta

20

Il messaggio di errore indica che Encoder non è in grado di utilizzare la classe di caso Person.

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. 

Spostare la dichiarazione della classe caso al di fuori del campo di applicazione del SimpleApp.

+12

Perché l'oscilloscopio fa la differenza qui? Ricevo questo errore durante l'utilizzo di REPL. – Wahbivic

2

Hai lo stesso errore se aggiungi sqlContext.implicits._ e spark.implicits._ in SimpleApp (l'ordine non ha importanza).

Rimozione uno o l'altro sarà la soluzione:

val spark = SparkSession 
    .builder() 
    .getOrCreate() 

val sqlContext = spark.sqlContext 
import sqlContext.implicits._ //sqlContext OR spark implicits 
//import spark.implicits._ //sqlContext OR spark implicits 

case class Person(age: Long, city: String) 
val persons = ctx.read.json("/tmp/persons.json").as[Person] 

Testato con Spark 2.1.0

La cosa divertente è che se si aggiunge la stessa impliciti oggetto due volte non avrete problemi .