scala - Spark : Input a vector

标签 scala apache-spark apache-spark-mllib

我陷入了 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/

相关文章:

scala - Scala 中的多键映射

scala - SQLContext 隐式

apache-spark - Spark应用程序覆盖yarn-site.xml配置参数

scala - MLlib依赖项错误

machine-learning - 处理 apache Spark MLLib 中 SVM 中的缺失值

json - 如何使用 json 模式验证器验证可为空类型?

json - 如何使用 Spray Json 的默认值?

scala - 如何创建注释并在 scala 中获取它们

scala - HDFS目录作为Spark Streaming中的参数

apache-spark - 决策树的 Spark 数据分区