Фильтрация фрейма данных Spark SQL для определения расстояния

У меня есть Spark SQL DataDrame с широтой и долготой столбцов, я пытаюсь фильтровать строки, которые опускаются ниже порогового значения, вычисляя расстояние до входа. Мой текущий код выглядит так. Я использую geopy (great_circle) для вычисления расстояния между парами широта и долгота.

from geopy.distance import great_circle

point = (10, 20)
threshold = 10
filtered_df = df.filter(great_circle(point, (df.lat, df.lon)) < threshold)

Когда я запускаю этот код, я получаю следующую ошибку

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions. 

Я не понимаю, какая часть выражения фильтра неверна.


person Pramod Sripada    schedule 18.12.2017    source источник


Ответы (1)


Вы не можете применять простые функции Python к DataFrame. Вы должны использовать udf:

from pyspark.sql.functions import udf

@udf("float")
def great_circle_udf(x, y):
    return great_circle(x, y).kilometers

и примените его с помощью столбцов

from pyspark.sql.functions import lit, struct

point = struct(lit(10), lit(20))
df.filter(great_circle_udf(point, struct(df.lat, df.lon)) < threshold))

Синтаксис декоратора будет работать с 2.2, для более ранней версии вам понадобится стандартный udf вызов:

udf(great_circle, FloatType())
person Alper t. Turker    schedule 18.12.2017