如何展平序列的RDD

时间:2019-07-19 19:34:25

标签: scala apache-spark sequence rdd

我目前有一个RDD[Seq[MatrixEntry]],我试图通过将RDD[MatrixEntry]展开或展平来转换为Seq。我可以将Seq转换为其他数据类型,例如List,但是我无法将其完全删除。

我的问题与this非常相似,因为我可以转换Seq,但是使用MatrixEntry而不是Ints,但尝试使用类似的解决方案

error: type mismatch;
 found   : org.apache.spark.mllib.linalg.distributed.MatrixEntry
 required: scala.collection.GenTraversableOnce[?]

我要运行的代码正在尝试将DataFrame转换为CoordinateMatrix:

def matmaker(data: DataFrame):Unit={
    val rrd:RDD[(List[(Any,Int)],Long)] = data.rdd
        .map(r => r.toSeq.toList.zipWithIndex)
        .zipWithIndex()
    val precord:RDD[MatrixEntry] = rrd.map{
      case ((s:Seq[(Any,Int)],r:Long)) => s.map{
        case (value:Any,c:Int) => MatrixEntry(r,c,value.toString.toDouble)
      }.flatMap(List => List) //Problem Here
    }
    precord.foreach(println)
    //new CoordinateMatrix(precord.map(r=>r.take(r.length-1)))
  }

测试完成后,该函数的最终输入将从Unit更改为CoordinateMatrix

1 个答案:

答案 0 :(得分:0)

您的平面图只是放错了位置。

您需要像这样写}.flatMap(x=>x)}来代替}}.flatMap(x=>x)

def matmaker(data: DataFrame):CoordinateMatrix={
    val rrd:RDD[(List[(Any,Int)],Long)] = data.rdd
        .map(r => r.toSeq.toList.zipWithIndex)
        .zipWithIndex()
    val precord:RDD[MatrixEntry] = rrd.map{
        case ((s:Seq[(Any,Int)],r:Long)) => s.map{
            case (value:Any,c:Int) => MatrixEntry(r,c,value.toString.toDouble)
        }//No Problem Here, flatmap was moved
    }.flatMap(x => x) 
    new CoordinateMatrix(precord)
}