【问题标题】:How to calculate euclidean distance of each row in a dataframe to a constant reference array如何计算数据帧中每一行到常量参考数组的欧几里得距离
【发布时间】:2018-09-27 01:41:35
【问题描述】:

我有一个数据框,它是从具有 512 列(所有浮点值)的镶木地板文件创建的。

我正在尝试计算我的数据帧中每一行到常量参考数组的欧几里得距离。

我的开发环境是 Zeppelin 0.7.3,带有 spark 2.1 和 Scala。这是我运行的 zeppelin 段落:

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 中正确计算距离。

【问题讨论】:

    标签: scala apache-spark euclidean-distance


    【解决方案1】:

    我认为您可以使用柯里化来实现:

    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", eucDisUdf(myScalaVec)($"features") ) 它显示的“$”不是 StingContext 的成员。我用过: def eucDisUdf(myvec:linalg.Vector) = udf((features: linalg.Vector) => Vectors.sqdist(features, myvec))
    • val distDF = training.withColumn( "euc", eucDisUdf(myScalaVec)(col) ) 这对我有用;col 是:Column
    • @AkhilaV import spark.implicits._import sqlContext.implicits._
    猜你喜欢
    • 2021-03-30
    • 2018-11-02
    • 2020-01-23
    • 2020-06-19
    • 2018-08-26
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多