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

时间:2016-05-05 18:45:08

标签: scala apache-spark

我在数据框中有两个时间戳列,我希望得到的小时差异,或者是小时差异。目前,通过执行

,我可以通过舍入来获得日差
val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2")))

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

2 个答案:

答案 0 :(得分:17)

您可以通过

获得秒数差异
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) )

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

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) )

或者,在pyspark:

RUN

答案 1 :(得分:0)

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 $