如何将稀疏向量的 Spark DataFrame 列转换为密集向量列?
How to convert Spark DataFrame column of sparse vectors to a column of dense vectors?
我使用了以下代码:
df.withColumn("dense_vector", $"sparse_vector".toDense)
但是它给出了一个错误。
我是 Spark 的新手,所以这可能很明显,并且我的代码行中可能存在明显的错误。请帮忙。谢谢!
需要这样操作的上下文在Spark中比较少见。除了一两个例外,Spark API 期望常见的 Vector
class 而不是特定的实现(SparseVector
、DenseVector
)。对于来自 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。参见
我使用了以下代码:
df.withColumn("dense_vector", $"sparse_vector".toDense)
但是它给出了一个错误。
我是 Spark 的新手,所以这可能很明显,并且我的代码行中可能存在明显的错误。请帮忙。谢谢!
需要这样操作的上下文在Spark中比较少见。除了一两个例外,Spark API 期望常见的 Vector
class 而不是特定的实现(SparseVector
、DenseVector
)。对于来自 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。参见