【问题标题】:How to convert Spark DataFrame column of sparse vectors to a column of dense vectors?如何将稀疏向量的 Spark DataFrame 列转换为密集向量的列?
【发布时间】:2017-01-01 02:46:21
【问题描述】:

我使用了以下代码:

df.withColumn("dense_vector", $"sparse_vector".toDense)  

但它给出了一个错误。

我是 Spark 的新手,所以这可能很明显,并且我的代码行中可能存在明显的错误。请帮忙。谢谢!

【问题讨论】:

    标签: apache-spark dataframe apache-spark-sql apache-spark-mllib apache-spark-ml


    【解决方案1】:

    需要这样操作的上下文在 Spark 中是比较少见的。除了一两个例外,Spark API 期望通用 Vector 类而不是特定实现(SparseVectorDenseVector)。对于来自o.a.s.mllib.linalg.distributed的分布式结构也是如此

    import org.apache.spark.mllib.linalg.{Vector, Vectors}
    import org.apache.spark.mllib.linalg.distributed.RowMatrix
    
    val df = Seq[(Long, Vector)](
      (1L, Vectors.dense(1, 2, 3)), (2L, Vectors.sparse(3, Array(1), Array(3)))
    ).toDF("id", "v")
    
    new RowMatrix(df.select("v")
      .map(_.getAs[Vector]("v")))
      .columnSimilarities(0.9)
      .entries
      .first
    // apache.spark.mllib.linalg.distributed.MatrixEntry = MatrixEntry(0,2,1.0)
    

    不过你可以像这样使用 UDF:

    val asDense = udf((v: Vector) => v.toDense)
    
    df.withColumn("vd", asDense($"v")).show
    // +---+-------------+-------------+
    // | id|            v|           vd|
    // +---+-------------+-------------+
    // |  1|[1.0,2.0,3.0]|[1.0,2.0,3.0]|
    // |  2|(3,[1],[3.0])|[0.0,3.0,0.0]|
    // +---+-------------+-------------+
    

    请记住,自 2.0 版以来,Spark 提供了两种不同且兼容的 Vector 类型:

    • o.a.s.ml.linalg.Vector
    • o.a.s.mllib.linalg.Vector

    每个都有对应的 SQL UDT。见MatchError while accessing vector column in Spark 2.0

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 2020-05-22
      • 2017-07-29
      • 2017-05-10
      • 1970-01-01
      • 2018-04-17
      • 2018-03-19
      • 2015-10-09
      • 2017-03-26
      相关资源
      最近更新 更多