2016-03-22 7 views
2

Wie kann ich eine Seq von Maps zu einem einzigen Map dhScala - Rückgängig eine flatmap nach transfomation

Seq[Map[String, String]] => Map[String, String] 

Zum Beispiel fusionieren:

val someSeq = rdd.map(_._2).flatMap(...) //some transformation to produce the sequence of maps 

wo someSeqSeq(student1, student2) und student1 und student2 sind Maps :

var student1 = Map(a -> "1", b -> "1") 
var student2 = Map(c -> "1", d -> "1") 

Ich brauche ein Ergebnis wie folgt aus:

val apps = Map(a -> "1", b -> "1", c -> "1", d -> "1") 

Jede Idee?

+3

Ich bin nicht sicher, wenn Spark in Ihrer Frage berücksichtigt wird, aber in der Regel würden Sie in Scala 'val apps = someSeq.flatten.toMap 'tun. –

+0

Und was 'Seq' macht hier? 'RDD' ist kein' Seq' ... – zero323

+0

@jwvh: guter Punkt, aber beide Karten sind einzigartig, aber ich bin neugierig, wie man das auch anstellt. Irgendein Vorschlag ? –

Antwort

3

Unrelated Spark, aber ein Ansatz wäre, um die Sequenz zu falten, wie folgt:

val student1 = Map("a" -> "1", "b" -> "1") 
val student2 = Map("c" -> "1", "d" -> "1") 

val students = Seq(student1, student2) 

students.foldLeft(Map[String, String]())(_ ++ _) 

Returns

Map(a -> 1, b -> 1, c -> 1, d -> 1) 

In Bezug auf "Verhängnis" ein flatMap, ich glaube nicht, das ist wirklich möglich. Um dies zu erreichen, sollten Sie den Begriff "Abflachen" in Betracht ziehen.

Zum Beispiel:

val x = Seq(1, 2) 
val y = Seq(3, 4) 
val combined = Seq(x, y) 
val flattened = combined.flatten 

val b = Seq(1, 2, 3) 
val c = Seq(4) 
val combined2 = Seq(b, c) 
val flattened2 = combined2.flatten 

flattened == flattened2 

Gibt true zurück.

Also im Grunde können Sie in diesem Fall von unplatted in flattened gehen, aber nicht umgekehrt, weil umgekehrt mehrere Antworten ergeben würden.