2017-06-09 3 views
0

Ich habe eine dataframe df die als json Datei in der folgenden Struktur gespeichert werden können: {"id":"1234567890","score":123.0,"date":yyyymmdd}Speichern Datenrahmen als JSON in spezifischen Struktur in Spark-Scala

für erstinstanzlichen ich es speichere wie folgt:

df.write.format("json").save("path") 

Diese df benötigt als json Datei in der folgenden Struktur id::1234567890\t{"id":"1234567890","score":123.0,"date":yyyymmdd}

ich verschiedene Weise versucht, gespeichert, aber konnte es nicht tun. Wie können wir es im gewünschten Format speichern?

Spark version: 1.6.0 
Scala version: 2.10.6 
+0

Ist dieser JSON sogar gültig? Was ist das? Id :: 1234567890 \ t' – philantrovert

+0

Warum sollten Sie in solchen Komplikationen speichern, wenn Sie bereits einen Datenrahmen haben, aus dem Sie immer 'id' und 'row' als erwartetes Ergebnis extrahieren können? –

Antwort

0

Das ist nicht json Format. Sie verwenden besser eine rdd und transformieren sie dann in das benutzerdefinierte Format.

final case class LineOfSomething(id: String, score: BigDecimal, date: String) 
import sqlContext.implicits._ 
df 
    .as[LineOfSomething] 
    .rdd 
    .mapPartitions(lines => { 
    val mapper = new com.fasterxml.jackson.databind.ObjectMapper() 
    mapper.registerModule(com.fasterxml.jackson.module.scala.DefaultScalaModule) 
    lines.map(line => { 
     val json = mapper.writeValueAsString(line) 
     s"id::${line.id}\t$json" 
    }) 
    }) 
    .saveAsTextFile(output) 
+0

Iam bekomme den folgenden Fehler. Kann wegen der Version von Spark sein, die ich verwende, also Spark 1.6.0: Ausnahme im Thread "Haupt" org.apache.spark.sql.AnalysisException: Kann einen Encoder für innere Klasse 'com.company.class.RowMapper $ nicht erzeugen LineOfSomething "ohne Zugriff auf den Bereich, in dem diese Klasse definiert wurde. Versuchen Sie, diese Klasse aus der übergeordneten Klasse zu entfernen." sql.catalyst.encoders.ExpressionEncoder $$ anonfun $ 2.applyOrElse (ExpressionEncoder.scala: 264) \t um – qubiter

+0

führen Sie es innerhalb der Haupt "Objekt"? Wenn nicht, verschieben Sie die Fallklasse in eine eigene Datei. – Nils

+0

RowMapper ist ein separater Singleton mit anderen Mappern und Fallklassen. Ich habe diese neue Fallklasse in RowMapper eingefügt. Ich bekomme immer noch den gleichen Fehler. Sieht es auch so aus, als wäre das Problem mit Datensätzen unter der Haube? Ich denke nicht, dass 1.6.0 Datasets unterstützt? – qubiter