【问题标题】:Spark: Input a vectorSpark:输入一个向量
【发布时间】:2016-01-23 19:43:51
【问题描述】:

我陷入了火花,我遇到了 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 作为数字。 是否存在任何形式来直接加载存储在文本文件中的向量而不执行第二行?如何在地图阶段删除“[”? 我真的是火花新手,对不起,如果这是一个非常明显的问题。

【问题讨论】:

    标签: scala apache-spark apache-spark-mllib


    【解决方案1】:

    给定输入,您可以做的最简单的事情是使用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)
    

    【讨论】:

    • 我什至不知道这种方法存在!谢谢
    【解决方案2】:

    这是一种方法:

    val rdd = sc.textFile("/workingdirectory/dataset")
    val data = rdd.map {
       s => 
        val vect = s.replaceAll("\\[", "").replaceAll("\\]","").split(',').map(_.toDouble)
        Vectors.dense(vect)
    }
    

    为了便于阅读,我刚刚将地图分成几行。

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

    【讨论】:

    • drop(1).dropRight(1).split(",").map(_.toDouble)val p = "-?[0-9]+(?:\\.[0-9]+)?".r; p.findAllIn(s).map(_.toDouble) 怎么样?
    • 这就是为什么我说一种方式! :)
    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2017-02-02
    • 2015-10-19
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多