将Iterable [(Double,Double)]转换为Seq(Seq(Double))

时间:2019-02-14 09:23:34

标签: scala rdd iterable seq

我想将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的新手,在这方面的任何帮助都将受到赞赏。谢谢。

ANSWER :以下用于实现上述目标:

val RDDofSeq = groupedrdd.mapValues{iterable => iterable.toSeq.map{case (x,y) => Seq(x,y)}}

2 个答案:

答案 0 :(得分:3)

我在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)}

答案 1 :(得分:2)

您只需要map,而不是mapValues

val RDDofSeq = myRDD.map{case (x,y) => Seq(x,y)}