[英]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.