Ich benutze die Spark Scala API. Ich habe einen Spark-SQL Datenrahmen (lesen aus einer Avro-Datei) mit folgendem Schema:Wie benutze ich Spark SQL DataFrame mit flatMap?
root
|-- ids: array (nullable = true)
| |-- element: map (containsNull = true)
| | |-- key: integer
| | |-- value: string (valueContainsNull = true)
|-- match: array (nullable = true)
| |-- element: integer (containsNull = true)
Wesentlichen zwei Säulen [ids: Liste [Map [Int, String]], match: Liste [Int]]. Beispieldaten, die wie folgt aussieht: flatMap()
ist
[List(Map(1 -> a), Map(2 -> b), Map(3 -> c), Map(4 -> d)),List(0, 0, 1, 0)]
[List(Map(5 -> c), Map(6 -> a), Map(7 -> e), Map(8 -> d)),List(1, 0, 1, 0)]
...
Was ich tun möchte jede Zeile 3 Spalten erzeugen [id, Eigenschaft, Spiel]. Unter Verwendung der obigen zwei Zeilen wie die Eingabedaten würden wir bekommen:
[1,a,0]
[2,b,0]
[3,c,1]
[4,d,0]
[5,c,1]
[6,a,0]
[7,e,1]
[8,d,0]
...
und dann groupBy
die String
Eigenschaft (ex: a, b, ...) erzeugen count("property")
und sum("match")
:
a 2 0
b 1 0
c 2 2
d 2 0
e 1 1
ich würde so etwas tun wollen:
val result = myDataFrame.select("ids","match").flatMap(
(row: Row) => row.getList[Map[Int,String]](1).toArray())
result.groupBy("property").agg(Map(
"property" -> "count",
"match" -> "sum"))
das Problem ist, dass die flatMap
konvertiert DataFrame in RDD. Gibt es eine gute Möglichkeit, eine Operation vom Typ flatMap
gefolgt von groupBy
mithilfe von DataFrames auszuführen?
Vielen Dank für Ihre Antwort! Die DataFrame.explode-Methode ist genau das, wonach ich gesucht habe. –