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 获得所需的行为。请注意,在那种情况下,现在将是特定于机器的,并且您是 运行 并行的东西。
我有一个数据框
+--------------+-----------------+
|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 获得所需的行为。请注意,在那种情况下,现在将是特定于机器的,并且您是 运行 并行的东西。