簡體   English   中英

將 Spark Dataframe 轉換為 Scala Map 集合

[英]Converting a Spark Dataframe to a Scala Map collection

我試圖找到將整個 Spark dataframe 轉換為 scala Map 集合的最佳解決方案。 最好的說明如下:

從此(在 Spark 示例中)到 go:

val df = sqlContext.read.json("examples/src/main/resources/people.json")

df.show
+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+

對於 Scala 集合(Map of Maps)表示如下:

val people = Map(
Map("age" -> null, "name" -> "Michael"),
Map("age" -> 30, "name" -> "Andy"),
Map("age" -> 19, "name" -> "Justin")
)

我認為您的問題沒有道理-您的最外層Map ,我只看到您正在嘗試將值填充到其中-您需要在最外層Map具有鍵/值對。 話雖如此:

val peopleArray = df.collect.map(r => Map(df.columns.zip(r.toSeq):_*))

會給你:

Array(
  Map("age" -> null, "name" -> "Michael"),
  Map("age" -> 30, "name" -> "Andy"),
  Map("age" -> 19, "name" -> "Justin")
)

在那時,您可以執行以下操作:

val people = Map(peopleArray.map(p => (p.getOrElse("name", null), p)):_*)

這會給你:

Map(
  ("Michael" -> Map("age" -> null, "name" -> "Michael")),
  ("Andy" -> Map("age" -> 30, "name" -> "Andy")),
  ("Justin" -> Map("age" -> 19, "name" -> "Justin"))
)

我猜這確實是您想要的。 如果要在任意Long索引上鍵入它們,可以執行以下操作:

val indexedPeople = Map(peopleArray.zipWithIndex.map(r => (r._2, r._1)):_*)

這給你:

Map(
  (0 -> Map("age" -> null, "name" -> "Michael")),
  (1 -> Map("age" -> 30, "name" -> "Andy")),
  (2 -> Map("age" -> 19, "name" -> "Justin"))
)

首先從數據框獲取架構

val schemaList = dataframe.schema.map(_.name).zipWithIndex//get schema list from dataframe

從數據框獲取rdd並與其映射

dataframe.rdd.map(row =>
  //here rec._1 is column name and rce._2 index
  schemaList.map(rec => (rec._1, row(rec._2))).toMap
 ).collect.foreach(println)
val map =df.collect.map(a=>(a(0)->a(1))).toMap.asInstanceOf[Map[String,String]]

如果 map 中需要結果而不是 array(map)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM