flatMapping in scala / spark

时间:2015-06-16 01:07:05

标签: scala hashmap apache-spark flatmap

寻找一些帮助,解决如何使用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>

如上所述,我可以使用以下方法对第一部分进行flatMap:

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

但我仍然坚持如何从原始数据的第二部分保留字符串。

2 个答案:

答案 0 :(得分:0)

更新

我有一个替代解决方案 - 使用值翻转键并使用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
  3. 伪代码:

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

答案 1 :(得分:0)

这可能对您有用:

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