2017-12-18 23 views
0

スパークSQL DataDrameのカラムは緯度と経度を持ちますが、入力までの距離を計算してしきい値を下回る行をフィルタリングしようとしています。現在のコードは次のようになります。私はgeopygreat_circle)を使用して、緯度経度のペア間の距離を計算しています。距離のスパーク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

普通のPython関数をDataFrameに適用することはできません。あなたはudfを使用する必要があります。

from pyspark.sql.functions import udf 

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

とデコレータ構文を使用すると、標準のudf呼び出し必要があります以前のバージョンのために、2.2以降動作します列

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

でそれを適用します。

udf(great_circle, FloatType()) 
関連する問題