如何将不同的时区应用于 PySpark 中的时间戳

Let*_*zee 7 datetime apache-spark apache-spark-sql pyspark

我正在使用 Pyspark,我的输入数据包含一个时间戳列(包含时区信息),如下所示

\n
2012-11-20T17:39:37Z\n
Run Code Online (Sandbox Code Playgroud)\n

我想创建America/New_York这个时间戳的表示。我的理解是最好的工具是from_utc_timestamp. 尽管当我使用它时我得到了不合理的结果。

\n
F.from_utc_timestamp(F.col(\'ts\'), \'America/New_York\')\n>>> datetime.datetime(2012, 11, 20, 7, 39, 37)\n
Run Code Online (Sandbox Code Playgroud)\n

当它应该是

\n
datetime.datetime(2012, 11, 20, 12, 39, 37)\n
Run Code Online (Sandbox Code Playgroud)\n

从 from_utc_timestamp\'s doc我看到

\n
\n

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

\n
\n

所以我认为包含tzinfo并且不天真的时间戳是罪魁祸首。但我找不到从时间戳中删除这些信息的好方法。

\n

免责声明 - 1. 我不想为此依赖 UDF 2. 我无法更改SparkSession时区,因为这不是专用于该作业的集群。

\n

有任何想法吗?

\n

Moh*_*B C 9

SparkSession时区指向UTC 应该会给你所需的结果。

spark.conf.set('spark.sql.session.timeZone', 'UTC')

spark.sql("""select from_utc_timestamp('2012-11-20T17:39:37Z', 'America/New_York') as datetime""" ).show(truncate=False)
'''
+-------------------+
|datetime           |
+-------------------+
|2012-11-20 12:39:37|
+-------------------+'''
Run Code Online (Sandbox Code Playgroud)

或者,您可以将时区设置为America/New_York并使用to_timestamp().

spark.conf.set('spark.sql.session.timeZone', 'America/New_York')
spark.sql("""select to_timestamp('2012-11-20T17:39:37Z', "yyyy-MM-dd'T'HH:mm:ssz") as datetime""").show(truncate=False)
'''
+-------------------+
|datetime           |
+-------------------+
|2012-11-20 12:39:37|
+-------------------+'''
Run Code Online (Sandbox Code Playgroud)