Scala-在转换后撤消平面映射

Scala-在转换后撤消平面映射,scala,apache-spark,spark-streaming,scala-collections,Scala,Apache Spark,Spark Streaming,Scala Collections,如何将Map的Seq合并为单个Map,即 Seq[Map[String, String]] => Map[String, String] 例如: val someSeq = rdd.map(_._2).flatMap(...) //some transformation to produce the sequence of maps val x = Seq(1, 2) val y = Seq(3, 4) val combined = Seq(x, y) val flattened =

如何将
Map
Seq
合并为单个
Map
,即

Seq[Map[String, String]] => Map[String, String]
例如:

val someSeq = rdd.map(_._2).flatMap(...)  //some transformation to produce the sequence of maps
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
其中
someSeq
Seq(student1,student2)
student1
student2
地图

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

有什么想法吗?

与Spark无关,但一种方法是按如下顺序折叠序列:

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)
关于“撤销”平面图,我认为这是不可能的。为了做到这一点,考虑撤消“扁平化”的概念。 例如:

val someSeq = rdd.map(_._2).flatMap(...)  //some transformation to produce the sequence of maps
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
返回true


所以,基本上,在这个例子中,你可以从非平坦到平坦,但不能从平坦到平坦,因为反之亦然会产生多个答案。

我不确定你的问题中什么时候考虑了Spark,但通常你会在Scala中做
val apps=someSeq.flatte.toMap
。那么
Seq
在这里做什么
RDD
不是一个
Seq
…@jwvh:很好的观点,但这两个地图都是独一无二的,但我也想知道如何处理它。有什么建议吗?@zero323:这只是我需要在RDD上执行的中间转换,例如
stream.transform{…flatmap(…)}.foreachRDD(…)
但是
transform
需要一个函数
RDD[T]=>RDD[U]
,不是吗?那么,输出映射在哪里呢?或者如果您更喜欢
rdd
someSeq
的实际类型是什么?