寻找一些帮助,解决如何使用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))
但我仍然坚持如何从原始数据的第二部分保留字符串。
答案 0 :(得分:0)
我有一个替代解决方案 - 使用值翻转键并使用flatMapValues转换,然后再次使用值翻转键:查看伪代码:
x.map(x=>x._2, x._1).flatMapValues(x=>x).map(x=>x._2, x._1)
我建议添加一个预处理步骤(抱歉,我前面没有带scala解释器的计算机,直到明天才能提出工作代码)。
(DistanceMap, String)
转换为带有Tuple4列表的rdd:List((VertexId,String, Int, String), ... ())
伪代码:
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))