【问题标题】:PySpark convert Unix epoch to "yyyy-MM-dd HH:mm:ss" in UTCPySpark 将 Unix 纪元转换为 UTC 中的 \"yyyy-MM-dd HH:mm:ss\"
【发布时间】: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 中,16518861682022-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。我将根据您的评论发布我的答案。

标签: pyspark time utc epoch


【解决方案1】:

感谢@samkart 的评论。以下对我有用。

# set the session's timezone to UTC
timezone = spark.conf.get("spark.sql.session.timeZone")
spark.conf.set("spark.sql.session.timeZone", "UTC")

# convert unix epoch to time in UTC
time_df.select('*', F.from_unixtime(F.col('epoch'))).show()

# set the session's timezone back
spark.conf.set("spark.sql.session.timeZone", timezone)
+----------+-----------------------------------------+
|     epoch|from_unixtime(epoch, yyyy-MM-dd HH:mm:ss)|
+----------+-----------------------------------------+
|1651886168|                      2022-05-07 01:16:08|
+----------+-----------------------------------------+

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多