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
我有一个包含时间戳列的 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