2016-03-22 2 views
2

Как можно объединить Seq из Maps к одному Map т.е.Scala - отменить flatmap после transfomation

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

Например:

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

где someSeq является Seq(student1, student2) и student1 и student2 являются Maps :

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

Мне нужен результат, как этот:

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

Любая идея?

+3

Я не уверен, когда Spark учитывается в вашем вопросе, но обычно вы делаете 'val apps = someSeq.flatten.toMap' в Scala. –

+0

И что здесь делает 'Seq'? 'RDD' не является' Seq' ... – zero323

+0

@jwvh: хорошая точка, но оба Карты уникальны, но мне любопытно знать, как справиться с этим. Любое предложение ? –

ответ

3

Unrelated Спарк, но один подход будет сгиб последовательность следующим образом:

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

val students = Seq(student1, student2) 

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

Возвращает

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

Что касается «погибель» в flatMap, я не верю это действительно возможно. Для этого рассмотрим понятие «сгладить».

Например:

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 

Возвращает истинное.

Итак, в этом случае вы можете перейти от unflattened к flattened, но не наоборот, потому что наоборот даст несколько ответов.

 Смежные вопросы

  • Нет связанных вопросов^_^