根据PySpark中的时区将UTC时间戳转换为本地时间

Gau*_*sal 5 apache-spark apache-spark-sql pyspark

我有一个 PySpark DataFrame,df其中有一些列,如下所示。该hour列采用 UTC 时间,我想根据该time_zone列创建一个具有本地时间的新列。我怎样才能在 PySpark 中做到这一点?

df
    +-------------------------+------------+
    |  hour                   | time_zone  |
    +-------------------------+------------+
    |2019-10-16T20:00:00+0000 | US/Eastern |
    |2019-10-15T23:00:00+0000 | US/Central |
    +-------------------------+------------+

#What I want:
    +-------------------------+------------+---------------------+
    |  hour                   | time_zone  | local_time          |
    +-------------------------+------------+---------------------+
    |2019-10-16T20:00:00+0000 | US/Eastern | 2019-10-16T15:00:00 |
    |2019-10-15T23:00:00+0000 | US/Central | 2019-10-15T17:00:00 |
    +-------------------------+------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

Vam*_*ala 9

您可以使用内置from_utc_timestamp功能。请注意,该hour列需要作为没有时区的字符串传入函数。

下面的代码适用于从 2.4 开始的 spark 版本。

from pyspark.sql.functions import *
df.select(from_utc_timestamp(split(df.hour,'\+')[0],df.time_zone).alias('local_time')).show()
Run Code Online (Sandbox Code Playgroud)

对于 2.4 之前的 spark 版本,您必须将表示时区的常量字符串作为第二个参数传递给函数。

Documentation

pyspark.sql.functions.from_utc_timestamp(timestamp, tz)

这是支持 TIMESTAMP WITHOUT TIMEZONE 的数据库的常用函数。此函数采用与时区无关的时间戳,并将其解释为 UTC 中的时间戳,并将该时间戳呈现为给定时区中的时间戳。

然而,Spark 中的时间戳表示 Unix 纪元的微秒数,这与时区无关。所以在 Spark 中,这个函数只是将时间戳值从 UTC 时区转移到给定的时区。

如果输入是带时区的字符串,则此函数可能会返回令人困惑的结果,例如 '2018-03-13T06:18:23+00:00'。原因是,Spark首先根据字符串中的时区将字符串转换为时间戳,最后根据会话本地时区将时间戳转换为字符串来显示结果。

参数 timestamp – 包含时间戳的列

tz – 具有时区 ID 的字符串,例如“GMT”、“America/Los_Angeles”等

在 2.4 版更改: tz 可以采用包含时区 ID 字符串的列。