[英]Converting a Spark Dataframe to a Scala Map collection list
我正在嘗試將 Spark 數據框轉換為標量映射以及值列表。
最好如下圖所示:
val df = sqlContext.read.json("examples/src/main/resources/people.json")
df.show()
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
| 21|Michael|
+----+-------+
對一個 Scala 集合(Map of Maps(List(values)))表示如下:
Map(
(0 -> List(Map("age" -> null, "name" -> "Michael"), Map("age" -> 21, "name" -> "Michael"))),
(1 -> Map("age" -> 30, "name" -> "Andy")),
(2 -> Map("age" -> 19, "name" -> "Justin"))
)
由於我對Scala不太了解,所以我想知道這種方法是否可行。 如果它不一定是列表也沒關系。
你想要的數據結構其實是沒用的。 讓我通過問兩個問題來解釋我的意思:
Array
?Map[String, Any]
並進行不安全的元素訪問,而您可以建模為案例類?所以我認為你能做的最好的事情是:
case class Person(name: String, age: Option[Int])
val persons = df.as[Person].collect
val personsByName: Map[String, Array[Person]] = persons.groupBy(_.name)
結果將是:
Map(
Michael -> Array(Person(Michael, None), Person(Michael, Some(21)),
Andy -> Array(Person(Andy, Some(30))),
Justin -> Array(Person(Justin, Some(19)))
)
但是,如果您堅持數據結構,這是您需要使用的代碼:
val result: Map[Int, List[Map[String, Any]]] =
persons.groupBy(_.name) // grouping persons by name
.zipWithIndex // coupling index with values of array
.map {
case ((name, persons), index) =>
// put index as key, map each person to the desired map
index -> persons.map(p => Map("age" -> p.age, "name" -> p.name)).toList
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.