2017-12-18 15 views
0

위도 및 경도 열이있는 Spark SQL DataDrame을 가지고 있는데, 입력 거리를 계산하여 임계 값 아래로 떨어지는 행을 필터링하려고합니다. 내 현재 코드는 다음과 같습니다. 위도가 긴 쌍 사이의 거리를 계산할 때 geopy (great_circle)을 사용하고 있습니다. 이 코드를 실행하면거리에 대한 Spark SQL 데이터 프레임 필터링

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. 

다음과 같은 오류를 얻을.

답변

2

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())