2017-10-04 5 views
0

Ich muss quadratischen Abstand zwischen zwei Features Spalten eines Spark Datenframe berechnen. Wenn ich den folgenden Code ausführenFehler Berechnung Quadrat Entfernung in Spark-Scala

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

ich Fehler

Name: org.apache.spark.sql.AnalysisException
Nachricht: kann nicht lösen 'UDF (Funktionen, Features2)' aufgrund Datentyp stimmt nicht überein: Argument 1 erfordert einen Vektortyp, 'features' ist jedoch vom Typ Vektor. Argument 2 erfordert einen Vektortyp, jedoch ist 'features2' vom Vektor Typ.

Das Schema meines Datenrahmen

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

Auch ist, wird der Code unter

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) 

fein Warum ich diesen Fehler bin immer?

Antwort

2

Spark SQL nach 2.0 verwendet standardmäßig org.apache.spark.ml.linalg.Vector nicht org.apache.spark.mllib.linalg.Vector. Auch vector Spalt speichern Vectors nicht DenseVectors so sollten Sie korrekten Supertyp verwenden:

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

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

oder einfacher:

funcs.udf(MLVectors.sqdist _) 
Verwandte Themen