如何在Spark中将RDD <string>转换为RDD <vector>?

时间:2015-07-16 08:34:00

标签: scala apache-spark rdd

我有一个文件,每行都是这样的

info1,info2
info3,info4
...

扫描完之后,我想运行k-means算法:

  val rawData = sc.textFile(myFile)
  val converted = convertToVector(rawData)
  val kmeans = new KMeans()
  kmeans.setK(10)
  kmeans.setRuns(10)
  kmeans.setEpsilon(1.0e-6)
  val model = kmeans.run(rawData) -> problem: k-means accepts only RDD<Vector>

因为k-means只接受RDD<Vector>,所以我创建了一个将RDD<String> rawData转换为RDD<Vector>的函数。但是我对如何做到这一点感到困惑,下面的这个功能正在进行中:

def converToVector(rawData: RDD[String]): RDD[Vector] = {

    //TODO...
    val toConvert = rawData.collect().toVector
    val map = rawData.map {
      line => line.split(",").toVector
    }

    map
  }

有关如何实现这一目标的任何建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:5)

这是一个非常基本的操作,考虑到输入文件的每一行都是一个由逗号分隔的字符串表示的假设向量。

你只需要映射每个字符串entrie,将它拆分在分隔符上,然后从中创建一个密集的Vector:

val parsedData = rawData.map(s => Vectors.dense(s.split(',').map(_.toDouble)))