【问题标题】:flatMapping in scala/sparkscala/spark中的平面映射
【发布时间】:2015-06-16 23:42:08
【问题描述】:

寻找一些有关如何使用 spark 在 scala 中处理某些问题的帮助。

我有:

type DistanceMap = HashMap[(VertexId,String), Int]

这以 RDD 的形式构成了我的数据的一部分:

org.apache.spark.rdd.RDD[(DistanceMap, String)] 

简而言之,我的数据集如下所示:

 ({(101,S)=3},piece_of_data_1)
 ({(101,S)=3},piece_of_data_2)
 ({(101,S)=1, (100,9)=2},piece_of_data_3)

我想要做的是平面映射我的距离图(我可以做),但同时对于每个平面映射的DistanceMap 想要保留与之关联的字符串。所以我的结果数据看起来像这样:

({(101,S)=3},piece_of_data_1))<br>
({(101,S)=3},piece_of_data_2))<br>
({(101,S)=1},piece_of_data_3))<br>
({(109,S)=2},piece_of_data_3))<br>

如前所述,我可以使用以下方法对第一部分进行平面映射:

x.flatMap(x=>x._1).collect.foreach(println))

但我不知道如何保留原始数据第二部分中的字符串。

【问题讨论】:

  • 你的意思是({(100,9)=2},piece_of_data_3))而不是第二个({(101,S)=1},piece_of_data_3))
  • 是的,抱歉,我想要的剪切和粘贴错误数据应该是:({(101,S)=3},piece_of_data_1)) ({(101,S)=3},piece_of_data_2)) ( {(101,S)=1},piece_of_data_3)) ({(109,S)=2},piece_of_data_3))

标签: scala hashmap apache-spark flatmap


【解决方案1】:

这可能对你有用:

x.flatMap(x => x._1.map(y => (y,x._2)))

想法是从(Seq(a,b,c),Value) 转换为Seq( (a,Value), (b, Value), (c, Value))

这在 Scala 中是一样的,所以这是一个独立的简化 Scala 示例,您可以将其粘贴到 Scala REPL 中:

Seq((Seq("a","b","c"), 34), (Seq("r","t"), 2)).flatMap( x => x._1.map(y => (y,x._2)))

这会导致:

res0: Seq[(String, Int)] = List((a,34), (b,34), (c,34), (r,2), (t,2))

【讨论】:

  • 请解释你的答案。在 Stack Overflow 上不鼓励仅使用代码回答。
  • 它对你有用吗?如果可以,我可以写更多,如果没有,那么没有理由在这里花更多时间。
  • 我没有尝试您的解决方案,因为我只是在查看答案,但您的编辑似乎提高了您的答案质量。干得好!
【解决方案2】:

更新

我有一个替代解决方案 - 带值的翻转键并使用 flatMapValues 转换,然后再次翻转带值的键:请参阅伪代码:

x.map(x=>x._2, x._1).flatMapValues(x=>x).map(x=>x._2, x._1)

以前的版本

我建议添加一个预处理步骤(抱歉,直到明天我面前都没有配备 scala 解释器的计算机来提供工作代码)。

  1. 将 rdd 从 (DistanceMap, String) 转换为带有 Tuple4 列表的 rdd:List((VertexId,String, Int, String), ... ())
  2. 在结果上应用 flatMap

伪代码:

rdd.map( (DistanceMap, String) =>  List((VertexId,String, Int, String), ... ()))
    .flatMap(x=>x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多