Scala 带Spark数据帧的Geo滤波器
我对spark的数据帧还不熟悉,有时候会很奇怪。 假设我有一个数据框,其中包含带有纬度和经度坐标的日志Scala 带Spark数据帧的Geo滤波器,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,我对spark的数据帧还不熟悉,有时候会很奇怪。 假设我有一个数据框,其中包含带有纬度和经度坐标的日志 LogsDataFrame.printSchema : root |-- lat: double (nullable = false) |-- lon: double (nullable = false) |-- imp: string (nullable = false) |-- log_date: string (nullable = true) |-- pubuid: st
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是否在预定义位置的某个半径内
现在,如何过滤内部不满足的点日志。我试过了
logsDataFrame.filter(在(logsDF(“lat”)、logsDF(“lon”)、半径范围内)
但它不推断Double,而是将列作为类型返回。
我怎样才能让它工作?
spark站点中的文档有点简单化,我确信我遗漏了一些东西
感谢您的帮助。一般来说,您至少需要两件事才能使其正常工作。首先,您必须在中创建一个
UDF
包装:
import org.apache.spark.sql.functions.{udf, lit}
val withinUDF = udf(within _)
接下来,调用UDF时,应将半径标记为文字:
df.where(withinUDF($"lat", $"long", lit(RADIUS)))
由于不是每种类型都可以通过这种方式传递,因此创建包装器和调用lit
相当繁琐,您可能更喜欢使用curry:
def within(radius: Double) = udf((lat: Double, long: Double) => ???)
df.where(within(RADIUS)($"lat", $"long"))
这太棒了,太棒了。我错过了文字部分。我肯定会用咖喱重写代码。刚刚开始编写Scala。谢谢。