我有一个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 |
+--------------+-----------------+-----------------+
通常情况下,国防部应该返回整个部门的其余部分。但我得到一个逗号。也许我搞错了。
我需要你的帮助。
谢谢您。
1条答案
按热度按时间2ul0zpep1#
我相信这是类型问题。double的mod将返回一个double。
例子:
这将返回几行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()。请注意,在这种情况下,现在将是机器特定的,您正在并行运行的东西。