2017-12-23 3 views
0

Ich versuche derzeit, df1 mit DF2 beizutreten, wo jedes Datenfeld eine Spalte namens Abstand hat und in Metern gemessen wird. Ich will kommen, wo der Unterschied zwischen diesen beiden dataframes.distance < = 10 MeterWie arithmetische Operationen auf joinExpression in Apache Funke

So etwas wie dieses def1.join(df2, df1("distance") - df2("distance") <= 10).show()

Ich habe versucht die API-Dokumentation nachzuschlagen, aber ich habe nicht genug Beispiele.

Antwort

1

Sie können ein udf in einem Join verwenden, um dies zu erreichen.

val df1 = sc.parallelize(Array(1,2,3)).toDF("distance1") 
val df2 = sc.parallelize(Array(10,12,14)).toDF("distance2") 

val distanceUdf = spark.udf.register("distanceUdf", (in1 : Int, in2 : Int) => { 
    Math.abs(in1 - in2) 
}) 
df1.join(df2, distanceUdf(col("distance1"), col("distance2")) <= 10, "inner").show() 
+0

Wie würde ich einen Rückgabetyp für diese Funktion definieren? Ich versuche so etwas 'def distanceUdf (longA: Doppel, latA: Double, longAdrop: Doppel, latAdrop: Doppel, longB: Doppel, latB: Doppel, longBDrop: Doppel, latBDrop: Doppel): Int = { // berechnen b.pickup, a.dropoff Abstand Abstand val = calDistance (Longa, lata, longBDrop, latBDrop) if (Abstand <50) { return 0 } // berechnen b.dropoff, a.pickup Entfernung val distancePick = calDistance (longAdrop, latAdrop, longB, LATB) if (distancePick <20) { } return 0 return 1 } ' – Assem

+0

Ihr aktueller Rückgabetyp ist in Ihrem' distanceUdf' gut. Ich bemerkte einen Tippfehler in meiner Lösung (es sollte 'val distanceUdf' sein, nicht' def distanceUdf') - du kannst 'distanceUdf (col (" longA "), col (" latA "), col (" longAdrop ") machen, col ("latAdrop"), col ("langB"), col ("latB"), col ("langBDrop"), col ("latBDrop")) == 1' - und wenn dies wahr ist, sind die Zeilen beigetreten. – ayplam

Verwandte Themen