2017-12-18 3 views
0

ich einen Spark-SQL DataDrame mit Spalten Breite und Länge, Ich versuche, Reihen zu filtern, die durch die Berechnung des Abstands zu einem Eingang unter einem Schwellenwert fallen. Mein aktueller Code aussieht. Ich verwende geopy (great_circle), um den Abstand zwischen Paaren langer lat berechnen.Filtering Spark-SQL Datenrahmen für den Fern

from geopy.distance import great_circle 

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

Wenn ich diesen Code ausführen bekomme ich folgende Fehler

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

Ich bin verwirrt auf dem ein Teil des Filterausdruck ist falsch.

Antwort

2

können Sie nicht schlicht Python-Funktionen auf einem DataFrame anwenden. Sie müssen verwenden udf:

from pyspark.sql.functions import udf 

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

und wenden Sie es mit Säulen

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

Decorator-Syntax wird seit 2.2 arbeiten, für frühere Version udf Call Standard benötigen:

udf(great_circle, FloatType()) 
Verwandte Themen