Spark Scala:按小时或分钟计算的两列数据差
在一个数据帧中有两个时间戳列,我希望得到分钟差,或者小时差。目前,我可以通过执行以下操作来获得日差(四舍五入)Spark Scala:按小时或分钟计算的两列数据差,scala,apache-spark,Scala,Apache Spark,在一个数据帧中有两个时间戳列,我希望得到分钟差,或者小时差。目前,我可以通过执行以下操作来获得日差(四舍五入) val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2"))) 然而,当我看到文档页面时 我没有看到任何额外的参数来改变单位。它们是我应该使用的另一个函数吗?您可以通过 import org.apache.spark.sql.functions._ val diff_secs_col = col("ts1").ca
val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2")))
然而,当我看到文档页面时
我没有看到任何额外的参数来改变单位。它们是我应该使用的另一个函数吗?您可以通过
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时间戳(以秒为单位),减去它们,然后将差值转换为小时
有关功能的有用列表,请访问:
$我的解决方案将计算数据帧中每一行的差异。如果有问题,请更具体一些。另外,对于您的解决方案,我认为最好避免使用字符串表达式(它更难测试,也更容易出错):
val df2=df1.select((unix_timestamp(ts1)-unix_timestamp(ts2))/3600D)
。Jeremy:请说明为什么您认为@danieldpola的解决方案不起作用?这似乎对我有用。虽然我还没有尝试@Daniel de Paula的解决方案,但从Spark 2.3.2
开始,我可以确认@Jeremy的解决方案工作正常,它确实在几秒钟内返回了差值(不必除以3600)。我的源列具有格式yyyy-MM-dd HH:MM:ss.S