2016-04-20 20 views
6

Mam złożoną strukturę DataFrame i chciałbym łatwo zerować kolumnę. Stworzyłem niejawne klasy, które łączą funkcje i łatwo adresują struktury 2D DataFrame, ale gdy DataFrame staje się bardziej skomplikowana dzięki ArrayType lub MapType, nie miałem szczęścia. Na przykład:Jak zmodyfikować ramkę danych Spark ze złożoną strukturą zagnieżdżoną?

Mam schemat zdefiniowany jako:

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

chciałbym produkować nowy DF, który ma pole data.value z MapType ustawiony na NULL, ale jak to jest elementem tablicy I nie byłem w stanie wymyślić jak. Myślę, że będzie podobny do:

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

ale ostatecznie tworzy nową kolumnę data.values i nie modyfikować element values tablicy danych.

Odpowiedz

0

Od Spark 1.6 można używać klas case do mapowania ramek danych (zwanych zestawami danych). Następnie możesz zmapować swoje dane i przekształcić je w nowy schemat, który chcesz. Np

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() 

Otrzymany schemat nullableDF będą:

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)