如何计算数据帧中每行的欧氏距离到常量参考数组

时间:2018-04-17 07:25:44

标签: scala apache-spark euclidean-distance

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

我正在尝试计算数据帧中每行的欧氏距离为常量参考数组。

我的开发环境是Zeppelin 0.7.3,火花2.1和Sacala。这是我运行的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调用提供以下错误:

  

错误:类型不匹配;发现:org.apache.spark.ml.linalg.Vector   必需:org.apache.spark.sql.Column

我很感激如何消除此错误并在scala中正确计算距离。

1 个答案:

答案 0 :(得分:2)

我认为你可以用currying来实现这个目标:

func main() {
    dataChan := make(chan string)

    ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
    defer cancel()

    go func(ctx context.Context) {
        for {
            select {
            case dataChan <- "some data":
                time.Sleep(time.Second)
            case <-ctx.Done():
                fmt.Println(ctx.Err())
                close(dataChan)
                return
            }
        }
    }(ctx)

    for d := range dataChan {
        fmt.Println("Got:", d)
    }

}