Tôi đang sử dụng API Spark Scala. Tôi có một DataFrame Spark SQL (đọc từ một file Avro) với sơ đồ sau:Làm thế nào để sử dụng Spark SQL DataFrame với flatMap?
root
|-- ids: array (nullable = true)
| |-- element: map (containsNull = true)
| | |-- key: integer
| | |-- value: string (valueContainsNull = true)
|-- match: array (nullable = true)
| |-- element: integer (containsNull = true)
Về cơ bản 2 cột [id: Danh sách [Bản đồ [Int, String]], trận đấu: Danh sách [Int]]. dữ liệu mẫu mà trông giống như:
[List(Map(1 -> a), Map(2 -> b), Map(3 -> c), Map(4 -> d)),List(0, 0, 1, 0)]
[List(Map(5 -> c), Map(6 -> a), Map(7 -> e), Map(8 -> d)),List(1, 0, 1, 0)]
...
Những gì tôi muốn làm là flatMap()
mỗi hàng để sản xuất 3 cột [id, tài sản, trận đấu]. Sử dụng 2 hàng trên là dữ liệu đầu vào, chúng tôi sẽ nhận được:
[1,a,0]
[2,b,0]
[3,c,1]
[4,d,0]
[5,c,1]
[6,a,0]
[7,e,1]
[8,d,0]
...
và sau đó groupBy
các String
tài sản (ví dụ: a, b, ...) để sản xuất count("property")
và sum("match")
:
a 2 0
b 1 0
c 2 2
d 2 0
e 1 1
tôi muốn làm điều gì đó như:
val result = myDataFrame.select("ids","match").flatMap(
(row: Row) => row.getList[Map[Int,String]](1).toArray())
result.groupBy("property").agg(Map(
"property" -> "count",
"match" -> "sum"))
vấn đề là các flatMap
chuyển đổi DataFrame thành RDD. Có cách nào tốt để thực hiện hoạt động loại flatMap
theo sau là groupBy
bằng cách sử dụng DataFrames không?
Cảm ơn bạn đã trả lời! Phương thức DataFrame.explode chính xác là những gì tôi đang tìm kiếm. –