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

时间:2019-12-02 19:12:57

标签: apache-spark pyspark apache-spark-sql

我有一个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 |
    +-------------------------+------------+---------------------+

1 个答案:

答案 0 :(得分:0)

您可以使用内置的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()

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

Documentation

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

  

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

     

但是,Spark中的时间戳表示距Unix纪元的微秒数,这与时区无关。因此,在Spark中,此功能只需将时间戳值从UTC时区移到给定的时区即可。

     

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

     

参数   时间戳–包含时间戳的列

     

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

     

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