为距离过滤 Spark SQL 数据帧
Filtering Spark SQL dataframe for distance
我有一个带有纬度和经度列的 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.
我很困惑过滤器表达式的哪一部分是错误的。
您不能在 DataFrame
上应用纯 Python 函数。你必须使用 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())
我有一个带有纬度和经度列的 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.
我很困惑过滤器表达式的哪一部分是错误的。
您不能在 DataFrame
上应用纯 Python 函数。你必须使用 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())