我很生气,我在Vectors上遇到了问题
导入org.apache.spark.mllib.linalg。{Vectors,Vector}
我程序的输入是一个文本文件,其中包含RDD(Vector)的输出:
数据集.txt:
[-0.5069793074881704,-2.368342680619545,-3.401324690974588]
[-0.7346396928543871,-2.3407983487917448,-2.793949129209909]
[-0.9174226561793709,-0.8027635530022152,-1.701699021443242]
[0.510736518683609,-2.7304268743276174,-2.418865539558031]
因此,尝试做的是:
val rdd = sc.textFile("/workingdirectory/dataset")
val data = rdd.map(s => Vectors.dense(s.split(',').map(_.toDouble)))
我有错误,因为它读为[0.510736518683609作为数字。
是否存在任何形式可以直接加载存储在文本文件中的向量而无需执行第二行?如何在 map 阶段删除“[”?
我真的很陌生,很抱歉,如果这是一个非常明显的问题。
最佳答案
给定输入,您可以做的最简单的事情是使用Vectors.parse
:
scala> import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.Vectors
scala> Vectors.parse("[-0.50,-2.36,-3.40]")
res14: org.apache.spark.mllib.linalg.Vector = [-0.5,-2.36,-3.4]
它也适用于稀疏表示:
scala> Vectors.parse("(10,[1,5],[0.5,-1.0])")
res15: org.apache.spark.mllib.linalg.Vector = (10,[1,5],[0.5,-1.0])
将其与数据结合起来,所需要做的就是:
rdd.map(Vectors.parse)
如果您期望格式错误/空行,可以使用
Try
将其包装起来:import scala.util.Try
rdd.map(line => Try(Vectors.parse(line))).filter(_.isSuccess).map(_.get)