2016-04-20 1 views
6

Ich habe eine komplexe DataFrame-Struktur und möchte eine Spalte einfach auf Null setzen. Ich habe implizite Klassen erstellt, die Funktionalität verbinden und einfach 2D-Datenframe-Strukturen adressieren. Aber sobald der Datenrahmen mit ArrayType oder MapType komplizierter wird, hatte ich nicht viel Glück. Zum Beispiel:Wie ändert man einen Spark-Datenrahmen mit einer komplexen verschachtelten Struktur?

Ich habe Schema wie folgt definiert:

StructType(
    StructField(name,StringType,true), 
    StructField(data,ArrayType(
     StructType(
      StructField(name,StringType,true), 
      StructField(values, 
       MapType(StringType,StringType,true), 
      true) 
     ), 
     true 
    ), 
    true) 
) 

ich einen neuen DF-Kunden erstellen möchten, die das Feld data.value von MapType auf null gesetzt, aber da dies ein Element eines Arrays I Ich konnte nicht herausfinden, wie. Ich würde denken, es wäre ähnlich sein:

df.withColumn("data.values", functions.array(functions.lit(null))) 

aber das schafft schließlich eine neue Spalte von data.values und nicht modifizieren, um das values Element des Datenfeldes.

Antwort

0

Seit Spark 1.6 können Sie Fallklassen verwenden, um Ihre Datenrahmen (Datasets genannt) zuzuordnen. Dann können Sie Ihre Daten zuordnen und in das neue Schema umwandeln, das Sie möchten. Zum Beispiel:

case class Root(name: String, data: Seq[Data]) 
case class Data(name: String, values: Map[String, String]) 
case class NullableRoot(name: String, data: Seq[NullableData]) 
case class NullableData(name: String, value: Map[String, String], values: Map[String, String]) 

val nullableDF = df.as[Root].map { root => 
    val nullableData = root.data.map(data => NullableData(data.name, null, data.values)) 
    NullableRoot(root.name, nullableData) 
}.toDF() 

Das resultierende Schema nullableDF wird:

root 
|-- name: string (nullable = true) 
|-- data: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- name: string (nullable = true) 
| | |-- value: map (nullable = true) 
| | | |-- key: string 
| | | |-- value: string (valueContainsNull = true) 
| | |-- values: map (nullable = true) 
| | | |-- key: string 
| | | |-- value: string (valueContainsNull = true) 
Verwandte Themen