Насколько я знаю, встроенной функции евклидова расстояния нет, но вы можете легко построить ее с помощью sum , pow , sqrt в качестве уравнение довольно простое:
df1 = spark.createDataFrame([(1, 10, 1),(2, 13, 2), (3, 5, 3)], ["A", "B", "id"])
df2 = spark.createDataFrame([(3, 40, 1),(2, 20, 2), (3, 10, 3)],["A", "B", "id"])
df1 = df1.alias("df1")
df2 = df2.alias("df2")
df = df1.join(df2, 'id', 'inner')
df.show()
Output:
+---+---+---+---+---+
| id| A| B| A| B|
+---+---+---+---+---+
| 1| 1| 10| 3| 40|
| 3| 3| 5| 3| 10|
| 2| 2| 13| 2| 20|
+---+---+---+---+---+
expression = ['sqrt(sum(pow((df1.{col} - df2.{col}),2))) as {col}'.format(col=c) for c in df1.columns if c !='id']
print(expression)
df.selectExpr(expression).show()
Вывод:
['sqrt(sum(pow((df1.A - df2.A),2))) as A', 'sqrt(sum(pow((df1.B - df2.B),2))) as B']
+---+-----------------+
| A| B|
+---+-----------------+
|2.0|31.20897306865447|
+---+-----------------+
PS: collect следует использовать только когда фрейм данных мал, так как все данные загружаются в память вашего искрового драйвера.