2016-04-27 8 views
5

Sto cercando di trovare la soluzione migliore per convertire un intero dataframe Spark in una raccolta scala mappa. E 'meglio illustrato come segue:Conversione di un dataframe Spark in una collezione di mappe Scala

per andare da questo (negli esempi Spark):

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

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

Per una collezione Scala (Mappa di Maps) ha rappresentato in questo modo:

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

risposta

6

I non pensate che la vostra domanda abbia un senso - la più esterna Map, vedo solo che state provando a inserire dei valori in essa - dovete avere coppie chiave/valore nella vostra più esterna Map. Detto questo:

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

vi darà:

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

A quel punto si poteva fare:

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

che darebbe:

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

I' Sto indovinando che questo è davvero più quello che vuoi . Se si voleva immettere loro su un arbitrario indice Long, si può fare:

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

che ti dà:

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

Che ha funzionato. In realtà ho misspoke. Avevo bisogno solo di una raccolta di Maps e la prima riga mi dava esattamente ciò di cui avevo bisogno. Grazie –

+0

Dolce, accetta la mia risposta allora? '' ;-) –

0

in primo luogo ottenere lo schema da dataframe

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

Prendi il RDD da dataframe e mappatura con esso

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) 
Problemi correlati