我有一个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 |
+-------------------------+------------+---------------------+
答案 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版本,您必须将代表时区的常量字符串作为第二个参数传递给该函数。
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字符串的列。