2017-10-04 31 views
0

我需要計算火花數據幀的兩個特徵列之間的平方距離。當我運行下面的代碼計算spark-scala中的平方距離的誤差

val udf_dist = funcs.udf((x:DenseVector, y:DenseVector) => Vectors.sqdist(x,y)) 
    val df6 = df5.withColumn("dist", udf_dist(funcs.col("features"), 
              funcs.col("features2"))) 

我得到錯誤

名稱:org.apache.spark.sql.AnalysisException
消息:無法解析 'UDF(功能,功能2)' 因數據類型不匹配:參數1 需要向量類型,但'features'屬於向量類型。 參數2需要矢量類型,但是,'features2'是矢量 類型。

我的數據框的模式是

root 
|-- id: long (nullable = false) 
|-- features: vector (nullable = true) 
|-- id2: long (nullable = false) 
|-- features2: vector (nullable = true) 

此外,代碼爲什麼我得到這個錯誤以下運行良好

val v1: org.apache.spark.mllib.linalg.Vector = Vectors.dense(5) 
val v2: org.apache.spark.mllib.linalg.Vector = Vectors.dense(5) 

Vectors.sqdist(v1, v2) 

回答

2

2.0之後的Spark SQL默認使用org.apache.spark.ml.linalg.Vector而不是org.apache.spark.mllib.linalg.Vector。此外vector列存儲VectorsDenseVectors所以你應該使用正確的超類型:

import org.apache.spark.ml.linalg.{Vector => MLVector, Vectors => MLVectors} 

funcs.udf((x: MLVector, y: MLVector) => MLVectors.sqdist(x,y)) 

或簡單:

funcs.udf(MLVectors.sqdist _)