[英]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.