【问题标题】:Error calculating squared distance in Spark / Scala在 Spark / Scala 中计算平方距离时出错
【发布时间】:2018-03-16 03:02:02
【问题描述】:

我需要计算两个特征列之间的平方距离 火花数据框。当我运行以下代码时

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(features, features2)' 由于数据类型不匹配:参数 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)

为什么会出现这个错误?

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2011-12-26
      • 2013-04-07
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多