【问题标题】:Scala - Undo a flatmap after transformationScala - 转换后撤消平面图
【发布时间】:2018-03-18 14:11:11
【问题描述】:

如何将MapsSeq 合并到单个Map

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

例如:

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

其中someSeqSeq(student1, student2)student1student2Maps

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,但通常您会在 Scala 中使用 val apps = someSeq.flatten.toMap
  • Seq 在这里做什么? RDD 不是 Seq...
  • @jwvh:好点,但两个地图都是独一无二的,但我也很想知道如何处理它。有什么建议吗?
  • @zero323:这只是我需要在我的 RDD 上执行的中间转换,例如stream.transform{...flatmap(...)}.foreachRDD(...)
  • 但是transform 需要一个函数RDD[T] => RDD[U],不是吗?那么输出映射适合哪里呢?或者,如果您更喜欢 rddsomeSeq 的实际类型是什么?

标签: scala apache-spark spark-streaming scala-collections


【解决方案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)

关于“撤消”一个 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

返回真。

所以基本上,在这种情况下,您可以从未展平到展平,但反之则不行,因为反之亦然会产生多个答案。

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2016-08-08
    相关资源
    最近更新 更多