Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用spark/java的mod函数_Java_Dataframe_Apache Spark_Mod - Fatal编程技术网

使用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