2016-04-20 3 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) 
) 

Я хотел бы, чтобы произвести новый DF, который имеет поле data.value из MapType установлен в нуль, но так как это элемент массива I не смогли выяснить, как это сделать. Я думаю, что это было бы похоже на:

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

, но это в конечном счете создает новый столбец data.values и не изменяет values элемента массива данных.

ответ

0

Начиная с Spark 1.6, вы можете использовать классы case для отображения ваших данных (например, наборов данных). Затем вы можете сопоставить свои данные и преобразовать их в новую схему, которую вы хотите. Например:

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) 
Смежные вопросы