Причина ошибки ясна при проверке типа возвращаемого значения cosine
:
type(cosine([1, 2], [1, 3]))
# numpy.float64
Однако np.float64
является подклассом float
:
issubclass(np.float64, float)
# True
Итак, с небольшим изменением вашей функции,
def cosine_distance(a, b):
try:
return float(cosine(a, b)) # cosine(a, b).item()
except Exception as e:
return 0.0 # in case division by zero
Это будет работать
df.withColumn('cosine_distance', cosine_distance_udf('col_1', 'col_2')).show()
+------+------+---------------+
| col_1| col_2|cosine_distance|
+------+------+---------------+
|[1, 2]|[3, 4]| 0.01613009|
|[2, 1]|[3, 4]| 0.10557281|
+------+------+---------------+