mod 使用 spark 的函数 / java

mod function using spark / java

我有一个数据框

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

我想计算 tracking_time 和 current_time 之间的日期差异,就像这个计算器一样。

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

注意unix_timestamp()中的跟踪时间和current_date中的"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  |                
+--------------+-----------------+-----------------+

通常 mod 应该 return 整个部门的其余部分。但我得到一个逗号。 可能是我写错了。

我需要你的帮助。

谢谢。

我认为是类型问题。 Mod 的双倍将 return 双倍的。

示例:

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

这将 return 你几行 a = 3.5 和 b = 0.5。

如果你想要整数值,你需要 ceil/floor 你的值,然后转换为 IntegerType 然后 mod 会给你整数余数。

编辑:正如安德烈斯所指出的,时间单位不一样。所以首先你应该标准化时间单位。

tt = 1582037407 ct = 1594110202934

所以你的测量值相差 1000 倍。

(ct/1000 - tt) 会使它具有可比性。 这将以秒为单位,差异将是双精度值。 如果您需要整数,请转换您的值。然后 mode 将 return mod 的整数,如果你将它保持为双精度,它将表现为双精度的 mod。

另一个问题是 now() 将在序列化之前进行评估,因此您现在总是得到相同的结果。也许这是需要的,我不清楚所以我指出来。

如果您不想要相同的当前时间,那么您可能会通过可以为每一行评估 now() 的 UDF 获得所需的行为。请注意,在那种情况下,现在将是特定于机器的,并且您是 运行 并行的东西。