繁体   English   中英

将 Spark Dataframe 转换为 Scala Map 集合列表

[英]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不太了解,所以我想知道这种方法是否可行。 如果它不一定是列表也没关系。

你想要的数据结构其实是没用的。 让我通过问两个问题来解释我的意思:

    1. 外部地图的整数的目的是什么? 那些指数? 这些指数的逻辑是什么? 如果这些是索引,为什么不直接使用Array
    1. 为什么要使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM