簡體   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