TimestampType Scala中的差异和重置小时

时间:2018-03-23 09:42:54

标签: scala apache-spark

我在

中有两列
import org.apache.spark.sql.types.{TimestampType, ArrayType}

statusWithOutDuplication.withColumn("requestTime", unix_timestamp( col("requestTime"), "YYYY-MM-DD HH:MM:SS").cast("Timestamp"))
statusWithOutDuplication.withColumn("responseTime", unix_timestamp( col("responseTime"), "YYYY-MM-DD HH:MM:SS").cast("Timestamp"))

我想传递requestTime& responseTime进入下面的UDF并找到之后的差异 将分钟和秒设置为“0”

val split_hour_range_udf = udf { (startDateTime: TimestampType ,
                                      endDateTime: TimestampType ) =>

      }

在Python中,我们“替换”(startDateTime.replace(second=0,minute=0))Scala中的等价物是什么?

2 个答案:

答案 0 :(得分:0)

您可以创建UDF,如下所示,将值作为字符串发送,稍后转换为Timestamp。在UDF

val timeDFiff = udf((start: String , end : String) => {
  //convert to timestamp and find the difference
})

并将其用作

df.withColumn("responseTime", timeDiff($"requestTime", $"responseTime"))

您可以使用内置的Spark函数,例如dateDiff

,而不是使用UDF

答案 1 :(得分:0)

你可以这样做:

import org.apache.spark.sql.types.{TimestampType, ArrayType}

statusWithOutDuplication.withColumn("requestTime", unix_timestamp( col("requestTime"), "YYYY-MM-DD HH:MM:SS"))
statusWithOutDuplication.withColumn("responseTime", unix_timestamp( col("responseTime"), "YYYY-MM-DD HH:MM:SS"))

//This resets minute and second to 0
def resetMinSec(colName: String) = {
    col(colName) - minute(col(colName).cast("TimeStamp"))*60 - second(col(colname).cast("Timestamp"))
}

//create a new column with the difference between unixtimes
statusWithOutDuplication.select((resetMinSec("responseTime") - resetMinSec("requestTime")).as("diff"))

请注意,我没有将requestTime / responseTime投射到“时间戳”,您应该在找到差异后进行投射。

udf方法应该类似,但使用一些scala方法从时间戳中获取分钟/秒。

希望这有点帮助!