繁体   English   中英

使用Spark DataFrame进行地理过滤

[英]Geo Filter with Spark DataFrame

我是带有火花的数据帧的新手,有时候很奇怪。 假设我有一个包含纬度和经度坐标的日志的数据框。

 LogsDataFrame.printSchema :
 root
 |-- lat: double (nullable = false)
 |-- lon: double (nullable = false)
 |-- imp: string (nullable = false)
 |-- log_date: string (nullable = true)
 |-- pubuid: string (nullable = true)

另一方面,我有一个简单的方法

within(lat : Double, long : Double, radius : Double) : Boolean

它告诉lat和lon是否在预定位置的某个半径内。

现在,如何过滤内部不满足的Log Log。 我试过了

logsDataFrame.filter(within(logsDF("lat"), logsDF("lon"), RADIUS)

但它没有推断出Double,而是将Column作为类型返回。 我怎样才能使这个工作? 火花网站上的文档有点简单,我敢肯定我错过了一些东西。

谢谢您的帮助。

一般来说,至少需要两件事才能使它发挥作用。 首先,你必须创建一个UDF包装within

import org.apache.spark.sql.functions.{udf, lit}

val withinUDF = udf(within _)

接下来,当调用UDF时,radius应标记为文字:

df.where(withinUDF($"lat", $"long", lit(RADIUS)))

因为不是每种类型都可以通过这种方式传递并且创建包装器和调用lit是相当繁琐的,您可能更喜欢currying:

def within(radius: Double) = udf((lat: Double, long: Double) => ???)

df.where(within(RADIUS)($"lat", $"long"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM