从文本文件加载稀疏向量的 RDD

Load RDD of sparse vectors from text file

我在 Scala Spark Shell 中工作并拥有以下 RDD:

scala> docsWithFeatures
res10: org.apache.spark.rdd.RDD[(Long, org.apache.spark.mllib.linalg.Vector)] = MapPartitionsRDD[162] at repartition at <console>:9

我之前使用以下方法将其保存为文本:

docsWithFeatures.saveAsTextFile("path/to/file")

这是文本文件中的示例行(为了便于阅读,我在此处将其缩短):

(22246418,(112312,[4,11,14,15,19,...],[109.0,37.0,1.0,3.0,600.0,...]))

现在,我知道我可以将其保存为目标文件以简化操作,但原始文本格式更适合我的目的。

我的问题是,将此文本文件恢复为与上述格式相同的 RDD(即(整数,稀疏向量)元组的 RDD)的正确方法是什么?我假设我只需要加载 sc.textFile 然后应用几个映射函数,但我是 Scala 的新手,不知道如何去做。

一个简单的正则表达式和内置向量实用程序应该可以解决问题:

import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.rdd.RDD

def parse(rdd: RDD[String]): RDD[(Long, Vector)] = {
  val pattern: scala.util.matching.Regex = "\(([0-9]+),(.*)\)".r
  rdd .map{
    case pattern(k, v) => (k.toLong, Vectors.parse(v))
  }
}

用法示例:

val docsWithFeatures = sc.parallelize(Seq(
  "(22246418,(4,[1],[2.0]))", "(312332123,(3,[0,2],[-1.0,1.0]))"))\

parse(docsWithFeatures).collect
// Array[(Long, org.apache.spark.mllib.linalg.Vector)] =
//   Array((22246418,(4,[1],[2.0])), (312332123,(3,[0,2],[-1.0,1.0])))