从文本文件加载稀疏向量的 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])))
我在 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])))