Spark 2.1.x hier. Ich habe eine Reihe von JSON-Dateien (mit identischem Schema), die ich Dataset
wie so in einen einzigen Funken lesen:Hinzufügen mehrerer Spalten zu Spark Dataset beim Iterieren seiner Datensätze
val ds = spark.read.json("some/path/to/lots/of/json/*.json")
ich dann das ds
Schema drucken kann, und sehe, dass alles korrekt gelesen wurde:
ds.printSchema()
// Outputs:
root
|-- fizz: boolean (nullable = true)
|-- moniker: string (nullable = true)
|-- buzz: string (nullable = true)
|-- foo: string (nullable = true)
|-- bar: string (nullable = true)
Bitte beachten Sie die moniker
String-Spalte. Ich möchte jetzt:
- Fügen Sie diesem Dataset und/oder seinem Schema drei neue Spalten hinzu; (a) eine Datums-/Zeitspalte mit der Bezeichnung
special_date
, (b) eine UUID-Spalte mit der Bezeichnungspecial_uuid
und (c) eine Zeichenfolgenspalte mit der Bezeichnungspecial_phrase
; dann muß - I über alle Datensätze in
ds
, und für jeden Datensatz iterieren, dessenmoniker
Wert in drei Folgefunktionen übergeben: (a)deriveSpecialDate(val moniker : String) : Date
, (b)deriveSpecialUuid(val moniker : String) : UUID
und (c)deriveSpecialPhrase(val moniker : String) : String
. Die Ausgabe jeder dieser Funktionen muss dann der Wert dieses Datensatzes für die jeweilige Spalte werden.
Mein bester Versuch:
val ds = spark.read.json("some/path/to/lots/of/json/*.json")
ds.foreach(record => {
val moniker : String = record.select("moniker")
val specialDate : Date = deriveSpecialDate(moniker)
val specialUuid : UUID = deriveSpecialUuid(moniker)
val specialPhrase : String = deriveSpecialPhrase(moniker)
// This doesn't work because special_* fields don't exist in the original
// schema dervied from the JSON files. We're ADDING these columns after the
// JSON read and then populating their values dynamically.
record.special_date = specialDate
record.special_uuid = specialUuid
record.special_phrase = specialPhrase
})
Jede Idee, wie dies erreicht werden kann?
Also im Grunde möchten Sie drei Spalte hinzufügen, indem Sie jede Funktion aufrufen? \ –
Hallo @ShankarKoirala (+1) - ja genau! – smeeb