2016-05-19 2 views
-1

Ich habe bis hierher:Wie man JSON in Spark mit fasterxml ohne SparkSQL parsen kann?

import com.fasterxml.jackson.module.scala.DefaultScalaModule 
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper 
import com.fasterxml.jackson.databind.ObjectMapper 
import com.fasterxml.jackson.databind.DeserializationFeature 

case class Person(name: String, lovesPandas: Boolean) 

val mapper = new ObjectMapper() 

val input = sc.textFile("files/pandainfo.json") 
val result = input.flatMap(record => { 
    try{ 
     Some(mapper.readValue(record, classOf[Person])) 
    } catch { 
     case e: Exception => None 
    } 
}) 
result.collect 

aber Array() als Ergebnis (ohne Fehler) erhalten. Die Datei ist https://github.com/databricks/learning-spark/blob/master/files/pandainfo.json Wie gehe ich von hier aus weiter?


Nach Spark: broadcasting jackson ObjectMapper Beratung habe ich versucht,

import org.apache.spark._ 
import com.fasterxml.jackson.module.scala.DefaultScalaModule 
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper 
import com.fasterxml.jackson.databind.ObjectMapper 
import com.fasterxml.jackson.databind.DeserializationFeature 

case class Person(name: String, lovesPandas: Boolean) 

val input = """{"name":"Sparky The Bear", "lovesPandas":true}""" 
val result = input.flatMap(record => { 
    try{ 
     val mapper = new ObjectMapper() 
     mapper.registerModule(DefaultScalaModule) 
     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
     Some(mapper.readValue(record, classOf[Person])) 
    } catch { 
     case e: Exception => None 
    } 
}) 
result.collect 

und bekam

Name: Compile Error 
Message: <console>:34: error: overloaded method value readValue with alternatives: 
    [T](x$1: Array[Byte], x$2: com.fasterxml.jackson.databind.JavaType)T <and> 
    [T](x$1: Array[Byte], x$2: com.fasterxml.jackson.core.type.TypeReference[_])T <and> 
    [T](x$1: Array[Byte], x$2: Class[T])T <and> 
+1

Ich habe nur googeln, aber brauchen Sie 'mapper.registerModule (DefaultScalaModule)'? Haben Sie auch versucht, eine Person aus einem literalen String außerhalb von Spark zu analysieren, nur um zu überprüfen, ob dieses Bit in Ordnung ist? –

+0

@TheArchetypalPaul Dies kann mit wenig Google-Hilfe und einige Debugging gelöst werden .. –

+0

@ YuvalItzchakov, nun, ja, aber ich bin mir nicht sicher, warum Sie diesen Kommentar an mich gerichtet! –

Antwort

1

Ich sehe, dass Sie die Lern ​​Spark-Beispiele ausprobiert. Hier ist der Verweis auf den vollständigen Code https://github.com/holdenk/learning-spark-examples/blob/master/src/main/scala/com/oreilly/learningsparkexamples/scala/BasicParseJsonWithJackson.scala E.

+0

Dies funktioniert nicht in Jupyter Notebook. Jupyter weiß nicht, wie man die Jackson-Klassen importiert. Irgendeine Idee? – Make42

+0

Kannst du es besser erklären? – Erica

+0

Der Code, auf den Sie mich hingewiesen haben, funktioniert nicht im Jupyter-Notizbuch. Ich fange an zu vermuten, dass das nicht daran liegt, dass der Code falsch ist, sondern wegen des Notebooks. Vielleicht funktioniert der Code von Learning Funke nicht gut zusammen mit dem Notebook. – Make42

0

Statt sc.textfile("path\to\json") Sie können versuchen, diese (i es in Java schreiben Cuz I ist nicht scala wissen aber die API gleich):

SQLContext sqlContext = new SQLContext(sc); 
DataFrame dfFromJson = sqlContext.read().json("path\to\json\file.json"); 

Funke liest Ihre JSON-Datei und konvertiert sie als Datenframe.

Wenn Ihr JSON-Datei eingebettet ist, Sie

org.apache.spark.sql.functions.explode(e: Column): Column 

zum Beispiel verwenden könnte, siehe meine Antwort here

Hoffnung diese Ihnen helfen.