2016-08-24 48 views

回答

2

需要像這樣操作的上下文在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