Spark Zeile JSON
Ich möchte eine JSON von einer Spark-v. 1.6 (mit scala) dataframe. Ich weiß, dass es die einfache Lösung zu tun df.toJSON
.
Allerdings ist mein problem etwas anders aussieht. Betrachten Sie zum Beispiel einen dataframe mit den folgenden Spalten:
| A | B | C1 | C2 | C3 |
-------------------------------------------
| 1 | test | ab | 22 | TRUE |
| 2 | mytest | gh | 17 | FALSE |
Ich würde gerne am Ende ein dataframe mit
| A | B | C |
----------------------------------------------------------------
| 1 | test | { "c1" : "ab", "c2" : 22, "c3" : TRUE } |
| 2 | mytest | { "c1" : "gh", "c2" : 17, "c3" : FALSE } |
wobei C ein JSON mit C1
, C2
, C3
. Leider habe ich zur compile-Zeit, weiß ich nicht, was das dataframe aussieht (mit Ausnahme der Spalten A
und B
sind immer "Feste").
Als für der Grund warum brauche ich das: ich bin mit Protobuf für das senden um die Ergebnisse. Leider ist mein dataframe manchmal hat mehr Spalten als erwartet und ich würde immer noch senden Sie diese per Protobuf, aber ich will nicht angeben, werden alle Spalten in der definition.
Wie kann ich das erreichen?
- noch ein dataframe
- Nein, sorry, ich meine eher, wie man hinzufügen
C1, C2, C3
als JSON-string-Spalte, um die bestehenden dataframe. Ich habe aktualisiert die post zu klären, für die version von Spark und scala als Sprache. - Sorry! Sicher, ich gerade aktualisiert die Frage (zusammen mit ein Grund, warum ich möchte, um dies zu erreichen) und fügte ein Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funke 2.1 sollte die native Unterstützung für diesen Anwendungsfall (siehe #15354).
Erste ermöglicht das konvertieren von C ist, um eine
struct
:Diese Struktur umgewandelt werden können, um JSONL mit
toJSON
wie vor:Ich kenne keine integrierte Methode, die die konvertieren kann eine einzelne Spalte, sondern Sie können entweder konvertieren Sie individuell und
join
oder verwenden Sie Ihre Lieblings-JSON-parser in eine UDF.join
-ing Spalten, aber nicht wirklich funktionieren, wie ich auf der einen Seite eineRDD[String]
und auf der anderen Seite eineDataFrame
UDF
. Sie haben nicht einmal zu verwenden, eine ausgewachsene JSON-parser in derUDF
- Sie können einfach Handwerk eine JSON-string on the fly mitmap
undmkString
. Sie werden wahrscheinlich brauchen, um zu verwendenDataFrame.columns
oder möglicherweiseDataFrame.dtypes
sowohl Handwerk derselect
Erklärung und als Grundlage dermap
imUDF
.Row
ist extrem hässlich Datenstruktur. Ansonsten können Sie erstellen Sie einfach eine beliebige komplexe AST mit Lift / json4s und konvertieren von JSON. Aber ehrlich gesagt, es ist zu viel Aufwand um es in ein SO Antwort.Row
hässlich ist aus dem gleichen Grund ich hasse den Umgang mit JSON in der Scala-es ist ein Kampf der Kulturen Loosey, goosey vs starke, statische Typisierung. SQL ist loosey goosey-Sie sind einselect
Weg von der Definition der neuen Art -- damitRow
ist chaotisch. Avro istGenericRecord
hat das gleiche problem.Hier keine JSON-parser, und es passt zu deinem schema:
Ich mit diesem Befehl lösen Sie die to_json problem: