1

寻找有关如何使用火花在 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))

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

4

2 回答 2

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

伪代码:

rdd.map( (DistanceMap, String) =>  List((VertexId,String, Int, String), ... ()))
    .flatMap(x=>x)
于 2015-06-16T01:43:52.873 回答
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))
于 2015-06-16T04:11:50.270 回答