Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 带Spark数据帧的Geo滤波器_Scala_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

Scala 带Spark数据帧的Geo滤波器

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

我对spark的数据帧还不熟悉,有时候会很奇怪。 假设我有一个数据框,其中包含带有纬度和经度坐标的日志

 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。谢谢。