【问题标题】:mod function using spark / java使用 spark/java 的 mod 函数
【发布时间】:2020-10-27 13:32:30
【问题描述】:

我有一个数据框

+--------------+-----------------+
|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 应该返回整个部门的其余部分。但我得到一个逗号。 可能是我写错了。

我需要你的帮助。

谢谢。

【问题讨论】:

  • tracking_timecurrent_time 的值看起来是否与您接近相似?它们不应该,因为tracking_time 为单位,current_time毫秒 为单位,因此将它们彼此相减确实会导致 毫无意义 价值。您需要在减去之前current_time 除以 1000
  • 15820374072020-02-18T14:50:07Z15941102029342020-07-07T08:23:22.934Z,即它们相隔 139 天 17 小时 33 分 15 秒(忽略 DST),那么计算 33 的意义何在分钟?
  • @Andreas 感谢您的回复。我不明白你能解释更多吗?
  • 30000 毫秒减去 25 秒是多少? 30000 - 25 = 29975 但 29975 是一个毫无意义的数字。它没有任何意义,因为它既不是秒也不是毫秒。 --- 30000 / 1000 - 25 = 30 - 25 = 5 是一个有用的值,即 5 秒,但这不是你在做什么。 --- seconds / 60 % 60 是小时/分钟/秒时间值的分钟部分。当您的值相差 139 天 时,知道分钟 part 是 33 的目的是什么? IE。对于139d 17h 33m 15s,值 33 用处不大。

标签: java dataframe apache-spark mod


【解决方案1】:

我认为是类型问题。 双倍的 Mod 将返回一个双倍。

例子:

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

这将返回几行 a = 3.5 和 b = 0.5。

如果你想要整数值,你需要对你的值设置上限/下限,然后转换为 IntegerType 然后 mod 会给你整数余数。

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

tt = 1582037407 ct = 1594110202934

所以你有 1000 倍的测量差异。

(ct/1000 - tt) 将使其具有可比性。 这将以秒为单位,差异将是双精度值。 如果您需要整数转换您的值。那么 mode 会返回整数的 mod,如果你把它保存在 double 中,它会表现得像 double 的 mod。

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

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

【讨论】:

  • 问题在于 tracking_time 为单位,current_time毫秒 为单位,因此减去它们没有任何意义。
  • 公平点,但他的问题是关于除法的整数部分:“通常 mod 应该返回整个除法的其余部分。但我得到一个逗号数字。”这在我所说的内容中得到了正确解决,因为在除法之后他得到了一个双倍然后 mod 操作以上述方式工作,我不得不承认我错过了括号,我真的认为他只是将 current_time 与 60*1000 相除而不是减法,但即使这样也没有意义
猜你喜欢
  • 2020-10-29
  • 2020-10-30
  • 2016-12-20
  • 2020-10-04
  • 2020-10-30
  • 2015-12-20
  • 2014-07-22
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多