[英]How to calculate euclidean distance of each row in a dataframe to a constant reference array
我有一個數據框,它是從具有 512 列(所有浮點值)的鑲木地板文件創建的。
我正在嘗試計算數據幀中每一行到常量參考數組的歐幾里德距離。
我的開發環境是 Zeppelin 0.7.3,帶有 spark 2.1 和 Scala。 這是我運行的齊柏林飛艇段落:
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.linalg.Vectors
//Create dataframe from parquet file
val filePath = "/tmp/vector.parquet/*.parquet"
val df = spark.read.parquet(filePath)
//Create assembler and vectorize df
val assembler = new VectorAssembler()
.setInputCols(df.columns)
.setOutputCol("features")
val training = assembler.transform(df)
//Create udf
val eucDisUdf = udf((features: Vector,
myvec:Vector)=>Vectors.sqdist(features, myvec))
//Cretae ref vector
val myScalaVec = Vectors.dense( Array.fill(512)(25.44859))
val distDF =
training2.withColumn("euc",eucDisUdf($"features",myScalaVec))
此代碼為 eucDisUdf 調用提供以下錯誤:
error: type mismatch; found : org.apache.spark.ml.linalg.Vector
required: org.apache.spark.sql.Column
我很欣賞如何在 Scala 中消除此錯誤並正確計算距離的任何想法。
我認為你可以使用柯里化來實現:
def eucDisUdf(myvec:Vector) = udf((features: Vector) => Vectors.sqdist(features, myvec))
val myScalaVec = Vectors.dense(Array.fill(512)(25.44859))
val distDF = training2.withColumn( "euc", eucDisUdf(myScalaVec)($"features") )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.