Scala 如何计算数据帧中每行到恒定参考数组的欧氏距离

Scala 如何计算数据帧中每行到恒定参考数组的欧氏距离,scala,apache-spark,euclidean-distance,Scala,Apache Spark,Euclidean Distance,我有一个数据框,它是从有512列(所有浮点值)的拼花文件创建的 我试图计算数据帧中每一行到常数参考数组的欧几里德距离 我的开发环境是齐柏林飞艇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 file

我有一个数据框,它是从有512列(所有浮点值)的拼花文件创建的

我试图计算数据帧中每一行到常数参考数组的欧几里德距离

我的开发环境是齐柏林飞艇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))
此代码为EUCDF调用提供以下错误:

error: type mismatch;  found   : org.apache.spark.ml.linalg.Vector 
required: org.apache.spark.sql.Column

我很欣赏如何在scala中消除此错误并正确计算距离的任何想法。

我认为您可以使用Curring来实现这一点:

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") )

val distDF=training2.withColumn(“euc”,eucdisdf(myScalaVec)($“features”))其显示的“$”不是StingContext的成员。我使用了:def eucdusedf(myvec:linalg.Vector)=udf((features:linalg.Vector)=>Vectors.sqdist(features,myvec))val distDF=training.withColumn(“euc”,eucdusedf(myScalaVec)(col)),它对我有用;col是:Column@AkhilaV
导入spark.implicits.\u
导入sqlContext.implicits.\u