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)
您可以使用内置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 版本,您必须将表示时区的常量字符串作为第二个参数传递给函数。
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 字符串的列。
归档时间: |
|
查看次数: |
10843 次 |
最近记录: |