Làm cách nào để thêm hoặc thay thế trường vào cấu trúc trên bất kỳ cấp độ lồng nhau nào?Thêm cột lồng vào Spark DataFrame
đầu vào này:
val rdd = sc.parallelize(Seq(
"""{"a": {"xX": 1,"XX": 2},"b": {"z": 0}}""",
"""{"a": {"xX": 3},"b": {"z": 0}}""",
"""{"a": {"XX": 3},"b": {"z": 0}}""",
"""{"a": {"xx": 4},"b": {"z": 0}}"""))
var df = sqlContext.read.json(rdd)
sản lượng schema sau:
root
|-- a: struct (nullable = true)
| |-- XX: long (nullable = true)
| |-- xX: long (nullable = true)
| |-- xx: long (nullable = true)
|-- b: struct (nullable = true)
| |-- z: long (nullable = true)
Sau đó, tôi có thể làm điều này:
import org.apache.spark.sql.functions._
val overlappingNames = Seq(col("a.xx"), col("a.xX"), col("a.XX"))
df = df
.withColumn("a_xx",
coalesce(overlappingNames:_*))
.dropNestedColumn("a.xX")
.dropNestedColumn("a.XX")
.dropNestedColumn("a.xx")
(dropNestedColumn
được vay mượn từ câu trả lời này: https://stackoverflow.com/a/39943812/1068385. Tôi về cơ bản đang tìm kiếm operati ngược trên đó)
Và schema trở thành:.
root
|-- a: struct (nullable = false)
|-- b: struct (nullable = true)
| |-- z: long (nullable = true)
|-- a_xx: long (nullable = true)
Rõ ràng nó không thay thế (hoặc thêm) a.xx
nhưng thay vào đó nó sẽ thêm lĩnh vực mới a_xx
trên mức root.
Tôi muốn để có thể làm điều này thay vì:
val overlappingNames = Seq(col("a.xx"), col("a.xX"), col("a.XX"))
df = df
.withNestedColumn("a.xx",
coalesce(overlappingNames:_*))
.dropNestedColumn("a.xX")
.dropNestedColumn("a.XX")
Vì vậy mà nó sẽ cho kết quả trong sơ đồ này:
root
|-- a: struct (nullable = false)
| |-- xx: long (nullable = true)
|-- b: struct (nullable = true)
| |-- z: long (nullable = true)
Làm thế nào tôi có thể đạt được điều đó?
Mục tiêu thực tế ở đây là phân biệt chữ hoa chữ thường với tên cột trong JSON đầu vào. Bước cuối cùng sẽ đơn giản: thu thập tất cả các tên cột trùng nhau và áp dụng kết hợp trên mỗi cột.
bạn đã có được giải pháp? –
@ShankarKoirala: không phải với Spark. Trong Hive nó là tầm thường để sử dụng COALESCE để đạt được những gì tôi muốn. – Arvidaa