仅在满足条件时计算 udf [重复]

Posted

技术标签:

【中文标题】仅在满足条件时计算 udf [重复]【英文标题】:Computing udf only when condition is satisfied [duplicate] 【发布时间】:2018-09-19 07:50:50 【问题描述】:

我有 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 之间的半正弦距离,只有当它们的值不同时。我所做的事情是,创建一个 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。

【问题讨论】:

“如果经纬度有差异”是什么意思? 【参考方案1】:

您的情况在问题中不清楚。但是,您可以使用“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));

我建议您参考link,了解有关根据条件执行列操作的更多详细信息。

【讨论】:

以上是关于仅在满足条件时计算 udf [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:不满足条件时如何让UDF返回0

仅在满足条件时如何应用edgeIgnoringSafeArea?

仅在满足条件时填充

仅在满足条件时使用提示

仅在满足条件时链接多个 CompletionStage

Python分组;仅在满足条件时保留