Scala Spark:输入一个向量

Scala Spark:输入一个向量,scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我进入了spark,我有向量的问题 导入org.apache.spark.mllib.linalg.{Vectors,Vector} 我的程序的输入是一个文本文件,其中包含RDD(向量)的输出: dataset.txt: [-0.5069793074881704,-2.368342680619545,-3.401324690974588] [-0.7346396928543871,-2.3407983487917448,-2.793949129209909] [-0.91742265617937

我进入了spark,我有向量的问题 导入org.apache.spark.mllib.linalg.{Vectors,Vector}

我的程序的输入是一个文本文件,其中包含RDD(向量)的输出: dataset.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]作为一个数字读取。 是否存在直接加载存储在文本文件中的向量而不执行第二行的表单?如何在映射阶段删除“[”?
我是spark的新手,如果这是一个非常明显的问题,我很抱歉。

这里有一种方法:

val rdd = sc.textFile("/workingdirectory/dataset")
val data = rdd.map {
   s => 
    val vect = s.replaceAll("\\[", "").replaceAll("\\]","").split(',').map(_.toDouble)
    Vectors.dense(vect)
}
为了便于阅读,我刚把地图分成几行


注意:记住,每行的字符串处理都很简单。

给定输入,最简单的方法就是使用
向量。解析

scala>import org.apache.spark.mllib.linalg.Vectors
导入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)

怎么样
drop(1).dropRight(1).split(“,”).map(\.toDouble)
val p=“-?[0-9]+(?:\\\.[0-9]+)?”.r;p.findAllIn(s).map(\.toDouble)
?这就是我说的唯一方法的原因!:)我甚至不知道这个方法存在!谢谢