scala - 如何计算数据帧中每行到常量引用数组的欧几里德距离

标签 scala apache-spark euclidean-distance

我有一个从 parquet 文件创建的数据框,有 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 中正确计算距离的想法。

最佳答案

我认为你可以使用柯里化(Currying)来实现这一点:

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

关于scala - 如何计算数据帧中每行到常量引用数组的欧几里德距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49872174/

相关文章:

scala - 函数组合的类型不匹配

apache-spark - 在本地主机上运行的 Spark BlockManager

python - 在两个点数组上循环

php - 计算欧氏距离平方

scala - Scala 中的::和::: 有什么区别

scala - 更正 apache spark 的 build.sbt 文件

scala - 如何使用 Def.app 和 KList 映射任务的依赖关系

apache-spark - 查找事件的 Hadoop 镜像

ubuntu - 从 Pyspark 访问 HDFS 失败

objective-c - 计算 N 维空间中两点之间欧氏距离的最快方法