Jeder Datensatz in einer RDD enthält einen JSON. Ich verwende SqlContext einen Datenrahmen aus dem Json wie diese zu erstellen:Wie Array in DataFrame (von JSON) abwickeln?
val signalsJsonRdd = sqlContext.jsonRDD(signalsJson)
Unter dem Schema ist. datepayload ist ein Array von Elementen. Ich möchte das Array von Elementen explodieren, um einen Datenrahmen zu erhalten, bei dem jede Zeile ein Element von data payload ist. Ich habe versucht, etwas zu tun, basierend auf this Antwort, aber es scheint, dass ich die gesamte Struktur des Elements in der Fall Row (arr: Array [...]) Anweisung modellieren müsste. Vermutlich vermisse ich etwas.
val payloadDfs = signalsJsonRdd.explode($"data.datapayload"){
case org.apache.spark.sql.Row(arr: Array[String]) => arr.map(Tuple1(_))
}
Der obige Code wirft einen scala.MatchError, weil die Art der tatsächlichen Row sehr unterschiedlich von Zeile ist (arr: Array [String]). Es gibt wahrscheinlich einen einfachen Weg, um zu tun, was ich will, aber ich kann es nicht finden. Bitte helfen Sie.
Schema geben unter
signalsJsonRdd.printSchema()
root
|-- _corrupt_record: string (nullable = true)
|-- data: struct (nullable = true)
| |-- dataid: string (nullable = true)
| |-- datapayload: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- Reading: struct (nullable = true)
| | | | |-- A2DPActive: boolean (nullable = true)
| | | | |-- Accuracy: double (nullable = true)
| | | | |-- Active: boolean (nullable = true)
| | | | |-- Address: string (nullable = true)
| | | | |-- Charging: boolean (nullable = true)
| | | | |-- Connected: boolean (nullable = true)
| | | | |-- DeviceName: string (nullable = true)
| | | | |-- Guid: string (nullable = true)
| | | | |-- HandsFree: boolean (nullable = true)
| | | | |-- Header: double (nullable = true)
| | | | |-- Heading: double (nullable = true)
| | | | |-- Latitude: double (nullable = true)
| | | | |-- Longitude: double (nullable = true)
| | | | |-- PositionSource: long (nullable = true)
| | | | |-- Present: boolean (nullable = true)
| | | | |-- Radius: double (nullable = true)
| | | | |-- SSID: string (nullable = true)
| | | | |-- SSIDLength: long (nullable = true)
| | | | |-- SpeedInKmh: double (nullable = true)
| | | | |-- State: string (nullable = true)
| | | | |-- Time: string (nullable = true)
| | | | |-- Type: string (nullable = true)
| | | |-- Time: string (nullable = true)
| | | |-- Type: string (nullable = true)
Sieht sehr ähnlich zu http://stackoverflow.com/q/43411832/1305344. –