键入不匹配 - (Int,Vector)而不是Vector

时间:2017-04-20 16:53:11

标签: scala apache-spark

我需要parallelize我的数据集,但是一旦我尝试使用重新分区的数据实例化type mismatch,就会出现RowMatrix错误。

这里是用于读取和重新分区数据的代码:

val data = sc.textFile("data.txt.gz").flatMap(r => r.split(' ') match {
  case Array(doc, word, count) => Some((doc.toInt, (word.toInt - 1, count.toDouble)))
  case _ => None
}).groupByKey().mapValues(a => Vectors.sparse(vocab_size, a.toSeq))

val repartitioned = sc.parallelize(Seq(data), 10)

现在我不太确定如何构建RowMatrix,因为

val mat: RowMatrix = new RowMatrix(repartitioned)

给出以下错误:

Main.scala:59: type mismatch;
 found   : org.apache.spark.rdd.RDD[org.apache.spark.rdd.RDD[(Int, org.apache.spark.mllib.linalg.Vector)]]
 required: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]
        val mat: RowMatrix = new RowMatrix(repartitioned)

1 个答案:

答案 0 :(得分:2)

parallelize用于从Seq的本地值创建和RDD,你已经有了一个RDD。试图调用并行化它不起作用,因为你试图将rdd放入rdd。如果要重新分区数据,请使用重新分区方法。即。 data.repartition(10)

当你调用mapValues时,它只适用于对你的对的值的操作,但是得到的RDD仍然是RDD [(Key,Value)]。如果您想丢弃密钥,那么只需使用map而不是mapValues。