【发布时间】:2022-11-12 13:37:32
【问题描述】:
我有一个代表 Unix 纪元的 bigint 列。我想将其转换为格式为“yyyy-MM-dd HH:mm:ss”的字符串世界标准时间.我尝试了几种方法,但它们都返回当地时间而不是 UTC 时间。
数据框time_df:
time_df = spark.createDataFrame(
[
(1651886168, ),
],
["epoch"]
)
root
|-- epoch: long (nullable = true)
+----------+
| epoch|
+----------+
|1651886168|
+----------+
在 UTC 中,1651886168 是 2022-05-07 01:16:08
不正确的方法1:
time_df.select('*', F.from_unixtime(F.col('epoch'))).show()
+----------+-----------------------------------------+
| epoch|from_unixtime(epoch, yyyy-MM-dd HH:mm:ss)|
+----------+-----------------------------------------+
|1651886168| 2022-05-06 18:16:08|
+----------+-----------------------------------------+
不正确的方法2:
time_df.select('*',
F.to_utc_timestamp(F.col('epoch').cast("timestamp"), tz='UTC').alias('timestamp'),
)
+----------+-------------------+
| epoch| timestamp|
+----------+-------------------+
|1651886168|2022-05-06 18:16:08|
+----------+-------------------+
不正确的方法3:
time_df = time_df.select('*',
F.to_utc_timestamp(F.col('epoch').cast("timestamp"), tz='UTC').alias('timestamp'))
time_df.select('*',
F.from_utc_timestamp(F.col('timestamp'), tz='UTC').alias('timestamp2'),
).show()
+----------+-------------------+-------------------+
| epoch| timestamp| timestamp2|
+----------+-------------------+-------------------+
|1651886168|2022-05-06 18:16:08|2022-05-06 18:16:08|
+----------+-------------------+-------------------+
对你的帮助表示感谢!
【问题讨论】:
-
尝试检查会话的时区 (
"spark.sql.session.timeZone")。 spark可能会基于此添加偏移量。通常,默认 tz 是 UTC 并且所有时间戳都转换为该值。 -
谢谢@samkart。您知道如何在转换前切换到 UTC 并在完成后切换回其原始设置吗?
-
在大多数情况下,您可以将其设置为空白,这会重置为默认值
-
谢谢@samkart。我将根据您的评论发布我的答案。