我陷入了 Spark ,但我在使用 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)
关于scala - Spark : Input a vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33316436/