在Spark / Scala中计算平方距离时出错

时间:2017-10-04 16:16:43

标签: apache-spark apache-spark-sql

我需要计算a的两个要素列之间的平方距离 Spark数据帧。当我运行以下代码时

val udf_dist = funcs.udf((x:DenseVector, y:DenseVector) => Vectors.sqdist(x,y))
val df6 = df5.withColumn("dist", udf_dist(funcs.col("features"),
                         funcs.col("features2")))

我收到错误

  

名称:org.apache.spark.sql.AnalysisException
  消息:无法解决   ' UDF(功能,特性2)'由于数据类型不匹配:参数1   但是,需要矢量类型,' features'是矢量类型。   参数2需要矢量类型,然而,' features2'是矢量   类型。

我的数据框的架构是

root
 |-- id: long (nullable = false)
 |-- features: vector (nullable = true)
 |-- id2: long (nullable = false)
 |-- features2: vector (nullable = true)

此外,下面的代码运行良好

val v1: org.apache.spark.mllib.linalg.Vector = Vectors.dense(5)
val v2: org.apache.spark.mllib.linalg.Vector = Vectors.dense(5)

Vectors.sqdist(v1, v2)

为什么我收到此错误?

1 个答案:

答案 0 :(得分:2)

2.0之后的Spark SQL默认使用org.apache.spark.ml.linalg.Vector而不是org.apache.spark.mllib.linalg.Vector。另外vector列存储Vectors而不是DenseVectors,因此您应该使用正确的超类型:

import org.apache.spark.ml.linalg.{Vector => MLVector, Vectors => MLVectors}

funcs.udf((x: MLVector, y: MLVector) => MLVectors.sqdist(x,y))

或更简单:

funcs.udf(MLVectors.sqdist _)