mod函数

roqulrg3  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(417)

我有一个Dataframe

+--------------+-----------------+
|tracking_time | current_time    |
+--------------+-----------------+
| 1582037407   |1594110202934    |                
| 1582037587   |1594110202934    |                
+--------------+-----------------+

我想计算跟踪时间和当前时间之间的日期差,就像这个计算。

long diffDate = (now.getTime() - tracking_date.getTime()) / (60 * 1000) % 60;

请注意,unix中的跟踪时间\u timestamp()和当前的\u日期是“currenttimemillis()。
我在spark上使用以下代码:

dataframe.withColumn("diffDate",col("current_time").minus( col("tracking_time")).divide(60*1000).mod(60));

但我得到以下结果

+---------------+----------------+-----------------+
|tracking_time | current_time    |  diffDate       |
+--------------+-----------------+-----------------+
| 1582037407   |1594110202934    |56.09211666509509|               
| 1582037587   |1594110202934    |56.089116666466  |                
+--------------+-----------------+-----------------+

通常情况下,国防部应该返回整个部门的其余部分。但我得到一个逗号。也许我搞错了。
我需要你的帮助。
谢谢您。

2ul0zpep

2ul0zpep1#

我相信这是类型问题。double的mod将返回一个double。
例子:

df.withColumn("a", lit(3.5)).withColumn("b", col("a") % 3).show()

这将返回几行a=3.5和b=0.5。
如果你想要整数值,你需要把你的值分隔开,然后转换成integertype,然后mod会给你iteger余数。
编辑:正如安德烈斯指出的,时间单位是不一样的。所以首先你应该标准化时间单位。
tt=1582037407 ct=1594110202934
所以你们的尺寸相差1000倍。
(ct/1000-tt)将使其具有可比性。以秒为单位,差值为双倍值。如果你需要它在整数铸造你的价值观。然后mode将返回mod of integer,如果您将其保持为double,它将作为mod of double。
另一个问题是now()将在序列化之前进行求值,因此您现在总是得到相同的结果。也许这是需要的,我不清楚,所以我指出。
如果您不想要相同的当前时间,那么您可能会通过udf获得所需的行为,该udf可以为每一行计算now()。请注意,在这种情况下,现在将是机器特定的,您正在并行运行的东西。

相关问题