满足条件才计算udf
Computing udf only when condition is satisfied
我有一个GPS数据:
t lat long
0 27 28
5 27 28
10 27 28
15 29 49
20 29 49
25 27 28
30 27 28
我只想计算两个lat-long 值不同时的haversine 距离。我所做的是,创建一个 udf 来计算相同的值:
def distanceTo(lat:Double,long:Double,lag_lat:Double,lag_long:Double): Double = {
val lat1 = math.Pi / 180.0 * lat
val lon1 = math.Pi / 180.0 * long
val lat2 = math.Pi / 180.0 * lag_lat
val lon2 = math.Pi / 180.0 * lag_long
// Uses the haversine formula:
val dlon = lon2 - lon1
val dlat = lat2 - lat1
val a = math.pow(math.sin(dlat / 2), 2) + math.cos(lat1) * math.cos(lat2) * math.pow(math.sin(dlon / 2), 2)
val c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
val meters = 6372.8 * c * 1000
meters
}
我做的步骤,将函数注册为 udf 并使用它得到一列半正弦距离:
val udf_odo = udf[Double,Double,Double,Double,Double](distanceTo)
val stoppage_df=lag_df
.withColumn("re_odo", udf_odo(col("lat"), col("long"),col("lag_latitude"), col("lag_longitude")))
但我希望只有在经纬度存在差异时才应调用此函数,否则该列应为 0。
问题中你的情况不清楚。但是,您可以使用 "when" 子句并在其中指定您的条件。见下文:
val stoppage_df=lag_df.withColumn("re_odo", when(<condition>, udf_odo(col("lat"),
col("long"),col("lag_latitude"), col("lag_longitude")))
.otherwise(0));
我建议您参考 以了解有关根据条件执行列操作的更多详细信息。
我有一个GPS数据:
t lat long
0 27 28
5 27 28
10 27 28
15 29 49
20 29 49
25 27 28
30 27 28
我只想计算两个lat-long 值不同时的haversine 距离。我所做的是,创建一个 udf 来计算相同的值:
def distanceTo(lat:Double,long:Double,lag_lat:Double,lag_long:Double): Double = {
val lat1 = math.Pi / 180.0 * lat
val lon1 = math.Pi / 180.0 * long
val lat2 = math.Pi / 180.0 * lag_lat
val lon2 = math.Pi / 180.0 * lag_long
// Uses the haversine formula:
val dlon = lon2 - lon1
val dlat = lat2 - lat1
val a = math.pow(math.sin(dlat / 2), 2) + math.cos(lat1) * math.cos(lat2) * math.pow(math.sin(dlon / 2), 2)
val c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
val meters = 6372.8 * c * 1000
meters
}
我做的步骤,将函数注册为 udf 并使用它得到一列半正弦距离:
val udf_odo = udf[Double,Double,Double,Double,Double](distanceTo)
val stoppage_df=lag_df
.withColumn("re_odo", udf_odo(col("lat"), col("long"),col("lag_latitude"), col("lag_longitude")))
但我希望只有在经纬度存在差异时才应调用此函数,否则该列应为 0。
问题中你的情况不清楚。但是,您可以使用 "when" 子句并在其中指定您的条件。见下文:
val stoppage_df=lag_df.withColumn("re_odo", when(<condition>, udf_odo(col("lat"),
col("long"),col("lag_latitude"), col("lag_longitude")))
.otherwise(0));
我建议您参考