Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Scala:按小时或分钟计算的两列数据差_Scala_Apache Spark - Fatal编程技术网

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