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")
)
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"))
)
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)