【问题标题】:Filtering Spark SQL dataframe for distance过滤 Spark SQL 数据帧的距离
【发布时间】:2017-12-18 18:35:44
【问题描述】:

我有一个带有纬度和经度列的 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. 

我很困惑过滤器表达式的哪一部分是错误的。

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql geopy


    【解决方案1】:

    您不能在 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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多