Unix 时间戳粒度更改为小时而不是毫秒

Unix timestamp granularity changed to hours instead of milliseconds

我有一个包含时间戳列的 Spark 数据框。我需要在此列之外以 unix_timestamp 格式创建 event_hour。当前的问题是时间戳是 unix_timestamp 格式,粒度为毫秒,而我需要小时粒度。

Current values for timestamp:
1653192037
1653192026
1653192025
1653192024
1653192023
1653192022

Expected values:
1653192000
1653195600
1653199200
1653202800

如何使用 Spark 函数实现? 我已经尝试将其转换为时间戳,然后对其进行格式化,但结果为空:

inputDf
.withColumn("event_hour", unix_timestamp(date_format($"timestamp".cast(TimestampType), "MM-dd-yyyy HH")))

一种(不是很明确但)有效的方法是对 3600 使用模数运算(因为 3600 秒 = 1 小时):

timestamp_hour = timestamp_second - (timestamp_second % 3600)

这假定您将数据作为数字进行操作。

您可以使用 DateUtils API,

import org.apache.commons.lang3.time.DateUtils;

Long epochTimestamp_hour =  DateUtils.truncate(Timestamp_column, Calendar.HOUR)).getTime();
  • 创建时间戳类型的新列
  • 使用该列将时间戳截断为 epochTimestamp_hour