2
我用下面的代碼:如何將稀疏向量的火花數據幀列轉換爲密集向量列?
df.withColumn("dense_vector", $"sparse_vector".toDense)
,但它給出了一個錯誤。 我是新來的火花,所以這可能是顯而易見的,我的代碼行中可能會有明顯的錯誤。請幫忙。謝謝!
我用下面的代碼:如何將稀疏向量的火花數據幀列轉換爲密集向量列?
df.withColumn("dense_vector", $"sparse_vector".toDense)
,但它給出了一個錯誤。 我是新來的火花,所以這可能是顯而易見的,我的代碼行中可能會有明顯的錯誤。請幫忙。謝謝!
需要像這樣操作的上下文在Spark中比較少見。有一個或兩個異常Spark API期望通用Vector
類未具體實現(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。見MatchError while accessing vector column in Spark 2.0