Let*_*zee 7 datetime apache-spark apache-spark-sql pyspark
我正在使用 Pyspark,我的输入数据包含一个时间戳列(包含时区信息),如下所示
\n2012-11-20T17:39:37Z\nRun Code Online (Sandbox Code Playgroud)\n我想创建America/New_York这个时间戳的表示。我的理解是最好的工具是from_utc_timestamp. 尽管当我使用它时我得到了不合理的结果。
F.from_utc_timestamp(F.col(\'ts\'), \'America/New_York\')\n>>> datetime.datetime(2012, 11, 20, 7, 39, 37)\nRun Code Online (Sandbox Code Playgroud)\n当它应该是
\ndatetime.datetime(2012, 11, 20, 12, 39, 37)\nRun Code Online (Sandbox Code Playgroud)\n从 from_utc_timestamp\'s doc我看到
\n\n\n如果输入是带有时区的字符串,则此函数可能会返回令人困惑的结果,例如 \xe2\x80\x982018-03-13T06:18:23+00:00\xe2\x80\x99。原因是,Spark首先根据字符串中的时区将字符串转换为时间戳,最后根据会话本地时区将时间戳转换为字符串来显示结果。
\n
所以我认为包含tzinfo并且不天真的时间戳是罪魁祸首。但我找不到从时间戳中删除这些信息的好方法。
\n免责声明 - 1. 我不想为此依赖 UDF 2. 我无法更改SparkSession时区,因为这不是专用于该作业的集群。
有任何想法吗?
\n将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)
| 归档时间: |
|
| 查看次数: |
23274 次 |
| 最近记录: |