Wie um die Karte struct im DataFrame zu Fall Klasse?
Irgendwann in meiner Anwendung habe ich einen DataFrame mit einem Struct-Feld erstellt von Fall Klasse. Jetzt möchte ich cast/anzeigen es wieder der Fall-Klasse Typ:
import spark.implicits._
case class Location(lat: Double, lon: Double)
scala> Seq((10, Location(35, 25)), (20, Location(45, 35))).toDF
res25: org.apache.spark.sql.DataFrame = [_1: int, _2: struct<lat: double, lon: double>]
scala> res25.printSchema
root
|-- _1: integer (nullable = false)
|-- _2: struct (nullable = true)
| |-- lat: double (nullable = false)
| |-- lon: double (nullable = false)
Und basic:
res25.map(r => {
Location(r.getStruct(1).getDouble(0), r.getStruct(1).getDouble(1))
}).show(1)
Sieht wirklich schmutzig
Gibt es eine einfachere Möglichkeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spark 1.6+ wenn Sie behalten möchten die Art von Informationen erhalten, dann verwenden Datensatz (DS), nicht DataFrame (DF).
Wird es Ihnen
Dataset[(Int, Location)]
. Nun, wenn Sie möchten, zu bekommen, um es zurück Fall Klasse Herkunft wieder, dann tun Sie einfach so:Aber, wenn Sie halten wollen, DataFrame API, durch die es den dynamischen Typ der Natur, dann müssen Sie Sie haben es code wie das:
select
ersten und dann gehen Sie für einemap
über es. Oder, wenn möglich, die Sie verwenden könnenDataset
.Konnte man auch mit dem Abzieher Muster in
Row
geben würden Sie zu ähnlichen Ergebnissen, mit mehr idiomatische scala:Ich denke, die anderen Antworten genagelt, aber vielleicht brauchen Sie vielleicht eine andere Wortwahl.
Kurz gesagt, es ist nicht möglich, case-Klassen in DataFrames, da Sie nicht den Fall, über case-Klassen und-Nutzung
RowEncoder
zum anzeigen der internen SQL-Typen zu einemRow
.Als die anderen Antworten gesagt, Sie haben zu drehen
Row
-basierteDataFrame
in eineDataset
mitas
Betreiber.