我想将Pair RDD“myRDD”值从Iterable [(Double,Double)]转换为Seq(Seq(Double)),但我不知道该怎么做。我尝试了以下但它不起作用。
val groupedrdd: RDD[BB,Iterable[(Double,Double)]] = RDDofPoints.groupByKey()
val RDDofSeq = groupedrdd.mapValues{case (x,y) => Seq(x,y)}
myRDD是在RddofPoints上使用groupByKey操作形成的,其各自的边界框为键。 BB是一个案例类,它是一组具有类型(Double,Double)的点的关键。我希望RDDofSeq具有类型RDD [BB,Seq(Seq(Double))],但是在groupByKey之后,myRDD具有RDD [BB,Iterable [(Double,Double)]]类型。
在这里,它给出了一个错误:
Error:(107, 58) constructor cannot be instantiated to expected type;
found : (T1, T2)
required: Iterable[(Double, Double)]
我是Scala的新手,对此方面的任何帮助表示赞赏。谢谢。
答案:以下内容用于实现上述目标:
val RDDofSeq = groupedrdd.mapValues{iterable => iterable.toSeq.map{case (x,y) => Seq(x,y)}}
我在Scalafiddle上尝试过这个
val myRDD: Iterable[(Double,Double)] = Seq((1.1, 1.2), (2.1, 2.2))
val RDDofSeq = myRDD.map{case (x,y) => Seq(x,y)}
println(RDDofSeq) // returns List(List(1.1, 1.2), List(2.1, 2.2))
唯一的区别是我使用myRDD.map(..
而不是myRDD.mapValues(..
确保myRDD
真的是Iterable[(Double,Double)]
类型!
评论后更新:
如果我理解你正确你想要一个Seq[Double]
而不是Seq[Seq[Double]]
那将是这样的:
val RDDofSeq = myRDD.map{case (k,v) => v} // returns List(1.2, 2.2)
类型现在清除后更新:
这些值的类型为Iterable[(Double,Double)]
,因此您无法在一对上匹配。
试试这个:
val RDDofSeq = groupedrdd.mapValues{iterable =>
Seq(iterable.head._1, iterable.head._2)}
你只需要map
,而不是mapValues
。
val RDDofSeq = myRDD.map{case (x,y) => Seq(x,y)}