簡體   English   中英

如何計算數據幀中每一行到恆定參考數組的歐幾里德距離

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM