2016-04-20 34 views
6

我有一個複雜的DataFrame結構,並希望能夠很容易地清空一列。我創建了隱含的類,可以連接功能並輕鬆地處理2D​​ DataFrame結構,但是一旦DataFrame變得更加複雜,ArrayType或MapType就沒有多少運氣。例如:如何使用複雜的嵌套結構修改Spark Dataframe?

我已經架構定義爲:

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

我想以產生具有場的MapType的data.value設置爲null新DF,但因爲這是一個數組的元素我一直無法弄清楚如何。我認爲這將是類似於:

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

但最終產生的data.values一個新的列,並且不修改數據陣列的values元素。

回答

0

自Spark 1.6以來,您可以使用大小寫類來映射數據框(稱爲數據集)。然後,您可以映射數據並將其轉換爲您想要的新架構。例如:

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

所得的nullableDF架構將是:

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)