web-dev-qa-db-fra.com

Conversion d'une image Spark Dataframe en une collection Scala Map

J'essaie de trouver la meilleure solution pour convertir une trame de données Spark entière en une collection scala Map. La meilleure illustration est la suivante:

Pour aller à partir de cela (dans les exemples Spark):

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

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

Pour une collection Scala (Map of Maps) représentée comme ceci:

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

Je ne pense pas que votre question ait un sens - votre Map extrême, je vois seulement que vous essayez d'y insérer des valeurs - vous devez avoir des paires clé/valeur dans votre Map extrême. Cela étant dit:

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

Te donnera:

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

À ce stade, vous pourriez faire:

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

Ce qui vous donnerait:

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

Je suppose que c'est vraiment plus ce que vous voulez. Si vous voulez les saisir sur un index Long arbitraire, vous pouvez faire:

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

Ce qui vous donne:

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

D'abord obtenir le schéma de Dataframe

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

Récupère le rdd de dataframe et mappe avec

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)
1
Amit Dubey