2016-04-20 22 views
6

Tôi có cấu trúc DataFrame phức tạp và muốn vô hiệu một cột dễ dàng. Tôi đã tạo ra các lớp ngầm định rằng chức năng dây và dễ dàng giải quyết các cấu trúc 2D DataFrame nhưng một khi DataFrame trở nên phức tạp hơn với ArrayType hoặc MapType, tôi đã không có nhiều may mắn. Ví dụ:Làm cách nào để sửa đổi một Khung dữ liệu Spark có cấu trúc lồng nhau phức tạp?

Tôi đã schema định nghĩa là:

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

Tôi muốn tạo ra một DF mới có lĩnh vực data.value của maptype thiết lập để null, nhưng vì đây là một phần tử của một mảng tôi đã không thể tìm ra cách. Tôi nghĩ rằng nó sẽ là tương tự như:

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

nhưng điều này cuối cùng tạo ra một cột mới của data.values và không thay đổi các yếu tố values của mảng dữ liệu.

Trả lời

0

Kể từ Spark 1.6, bạn có thể sử dụng các lớp chữ thường để ánh xạ các khung dữ liệu của bạn (được gọi là bộ dữ liệu). Sau đó, bạn có thể ánh xạ dữ liệu của mình và chuyển đổi nó sang giản đồ mới mà bạn muốn. Ví dụ:

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

Giản đồ kết quả của nullableDF sẽ là:

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) 
Các vấn đề liên quan