我需要计算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)
为什么我收到此错误?
答案 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 _)