Spark Scala:按小时或分钟划分的两列的DateDiff



我在一个数据帧中有两个时间戳列,我想得到的是的分钟差,或者是小时差。目前,我可以通过获得四舍五入的日差

val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2")))

然而,当我查看文档页面时https://issues.apache.org/jira/browse/SPARK-8185我没有看到任何额外的参数来改变单位。它们是我应该使用的不同功能吗?

您可以通过获得以秒为单位的差异

import org.apache.spark.sql.functions._
val diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long")

然后你可以做一些数学运算来得到你想要的单元。例如:

val df2 = df1
  .withColumn( "diff_secs", diff_secs_col )
  .withColumn( "diff_mins", diff_secs_col / 60D )
  .withColumn( "diff_hrs",  diff_secs_col / 3600D )
  .withColumn( "diff_days", diff_secs_col / (24D * 3600D) )

或者,在pyspark:中

from pyspark.sql.functions import *
diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long")
df2 = df1 
  .withColumn( "diff_secs", diff_secs_col ) 
  .withColumn( "diff_mins", diff_secs_col / 60D ) 
  .withColumn( "diff_hrs",  diff_secs_col / 3600D ) 
  .withColumn( "diff_days", diff_secs_col / (24D * 3600D) )

Daniel de Paula给出的答案有效,但在表中每一行都需要差异的情况下,该解决方案无效。这里有一个解决方案,可以为每一行做到这一点:

import org.apache.spark.sql.functions
val df2 = df1.selectExpr("(unix_timestamp(ts1) - unix_timestamp(ts2))/3600")

这首先将列中的数据转换为以秒为单位的unix时间戳,减去它们,然后将差值转换为小时。

可在以下位置找到有用的函数列表:http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.functions$

最新更新