将峰值[(double,double)]转换为seq(seq(double))



我想从iToble [((double,double)]]转换为seq(seq(double))的Pair rdd" myrdd"值,但是我不确定该怎么做。我尝试了以下内容,但它不起作用。

val groupedrdd: RDD[BB,Iterable[(Double,Double)]] = RDDofPoints.groupByKey()
val RDDofSeq = groupedrdd.mapValues{case (x,y) => Seq(x,y)}

MyRDD是使用rddofpoint上的GroupByKey操作形成的,其各自的边界框则作为键。BB是一个案例类,它是一组具有类型(双重,double)的点的关键。我希望rddofseq具有type rdd [bb,seq(seq(double))],但是在groupbykey之后,myrdd具有type rdd [bb,itoble [(double,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)}

最新更新