我在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很新,不知道如何去做。
答案 0 :(得分:3)
一个简单的正则表达式和内置的向量实用程序应该可以解决这个问题:
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])))