使用spark/java的mod函数
我有一个数据帧使用spark/java的mod函数,java,dataframe,apache-spark,mod,Java,Dataframe,Apache Spark,Mod,我有一个数据帧 +--------------+-----------------+ |tracking_time | current_time | +--------------+-----------------+ | 1582037407 |1594110202934 | | 1582037587 |1594110202934 | +--------------+-----------------+
+--------------+-----------------+
|tracking_time | current_time |
+--------------+-----------------+
| 1582037407 |1594110202934 |
| 1582037587 |1594110202934 |
+--------------+-----------------+
我想计算跟踪时间和当前时间之间的日期差,就像这个计算
long diffDate = (now.getTime() - tracking_date.getTime()) / (60 * 1000) % 60;
请注意,在unix_timestamp()中跟踪时间和在“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应该返回整个除法的其余部分,但我得到一个逗号。
也许我弄错了什么
我需要你的帮助
谢谢。我相信这是类型问题。 double的Mod将返回一个double 例如:
df.withColumn("a", lit(3.5)).withColumn("b", col("a") % 3).show()
这将返回a=3.5和b=0.5的几行
若你们想要整数值,你们需要将你们的数值降低/降低,然后转换为IntegerType,然后mod会给你们iteger余数
编辑:正如Andres所指出的,时间单位是不一样的。所以首先你应该将时间单位标准化
tt=1582037407
ct=1594110202934
所以你们的测量值相差1000倍
(ct/1000-tt)将使其具有可比性。
以秒为单位,差值为双倍值。
如果您需要它在整数中转换您的值。然后模式将返回整数的mod,如果您保持它在double中,它将作为double的mod
另一个问题是now()将在序列化之前进行求值,因此您现在将始终得到相同的结果。可能这是需要的,我不清楚,所以我指出了这一点
如果您不想要相同的当前时间,那么您可能会通过UDF获得指定的行为,该UDF可以为每一行计算now()。请注意,在这种情况下,now将是特定于机器的,并且您正在并行运行。我相信这是类型问题。 double的Mod将返回一个double 例如:
df.withColumn("a", lit(3.5)).withColumn("b", col("a") % 3).show()
这将返回a=3.5和b=0.5的几行
若你们想要整数值,你们需要将你们的数值降低/降低,然后转换为IntegerType,然后mod会给你们iteger余数
编辑:正如Andres所指出的,时间单位是不一样的。所以首先你应该将时间单位标准化
tt=1582037407
ct=1594110202934
所以你们的测量值相差1000倍
(ct/1000-tt)将使其具有可比性。
以秒为单位,差值为双倍值。
如果您需要它在整数中转换您的值。然后模式将返回整数的mod,如果您保持它在double中,它将作为double的mod
另一个问题是now()将在序列化之前进行求值,因此您现在将始终得到相同的结果。可能这是需要的,我不清楚,所以我指出了这一点
如果您不希望使用相同的当前时间,那么您可能会通过UDF获得指定的行为,该UDF可以立即评估()对于每一行。请注意,在这种情况下,现在将是特定于机器的,并且您正在并行运行。是否
跟踪时间
和当前时间
的值看起来与您非常相似?它们不应该相似,因为跟踪时间
以秒为单位,而当前时间
以毫秒为单位,所以减法g它们之间的相互作用确实会产生一个无意义的值。在减去之前,你需要将当前时间除以1000!即它们相隔139天17小时33分15秒(忽略DST),那么计算33分钟有什么意义呢?@Andreas谢谢你的回答。我不明白你能解释更多吗。30000毫秒减去25秒是多少?30000-25=29975
但是29975是一个无意义的数字。它没有任何意义,因为它既不是秒也不是毫秒。--30000/1000-25=30-25=5
是一个有用的值,即5秒,但这不是您正在做的。--秒/60%60
是一小时/分钟/秒时间值的分钟部分。当您的值相隔139天时,知道分钟部分是33的目的是什么?即对于139d 17h 33m 15s
,值33没有多大用处。是否>跟踪时间
和当前时间
值看起来更接近于您?它们不应该如此,因为跟踪时间
以秒为单位,而当前时间
以毫秒为单位,因此将它们相互相减会产生一个无意义的值。您需要在subtrac之前将当前时间
除以1000ting!1582037407
是2020-02-18T14:50:07Z
和1594110202934
是2020-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秒,但这不是您正在做的。--秒/60%60
是一小时/分钟/秒时间值的分钟部分。当您的值相隔139天时,知道分钟部分是33的目的是什么?即对于139d 17h 33m 15s
,值33几乎没有用处。问题是在跟踪时间
是以秒为单位的,当前时间
是以毫秒为单位的,所以减去它们没有意义。说得好,但他的问题是关于除法的整数部分:“通常mod应该返回整个除法的其余部分。但我有一个逗号。“这在我所说的中得到了正确的解决,因为除法后他得到了一个双精度,然后mod操作以上述方式工作,我必须承认我错过了括号,我真的认为他只是用60*1000除法当前时间,而不是减法,但即使这样也没有意义问题在tra