gpt4 book ai didi

python - 带有日期时间 tzaware 对象的 Pyspark 中的 TimeStampType

转载 作者:行者123 更新时间:2023-12-04 19:28:27 28 4
gpt4 key购买 nike

我有以下在 Pyspark 中无法完全理解的问题。我有以下日期时间对象

utc_now = datetime.now().replace(tzinfo=tz.tzutc())
utc_now # datetime.datetime(2018, 2, 12, 13, 9, 52, 785007, tzinfo=tzutc())

我创建了一个 spark DataFrame
data_df = spark.createDataFrame([Row(date=utc_now)])

当我尝试显示数据框时
data_df.show(10, False)

包含数据的列是本地时间 2 小时前
>>> data_df.show(10, False)
+--------------------------+
|date |
+--------------------------+
|2018-02-12 15:09:52.785007|
+--------------------------+

并且收集数据已将日期时间对象中的时间提前两个小时
>>> data_df.collect()
[Row(date=datetime.datetime(2018, 2, 12, 15, 9, 52, 785007))]

区域信息也被删除。转换到 TimestampType 时是否可以更改此行为? ?

最佳答案

TimestampType在 pyspark 中不像在 Pandas 中那样感知 tz,而是通过 long int s 并根据您机器的本地时区(默认情况下)显示它们。

话虽如此,您可以使用 'spark.sql.session.timeZone' 更改您的 Spark session 时区。

from datetime import datetime
from dateutil import tz
from pyspark.sql import Row

utc_now = datetime.now().replace(tzinfo=tz.tzutc())
print(utc_now)

spark.conf.set('spark.sql.session.timeZone', 'Europe/Paris')
data_df = spark.createDataFrame([Row(date=utc_now)])
data_df.show(10, False)
print(data_df.collect())

2018-02-12 20:41:16.270386+00:00
+--------------------------+
|date |
+--------------------------+
|2018-02-12 21:41:16.270386|
+--------------------------+

[Row(date=datetime.datetime(2018, 2, 12, 21, 41, 16, 270386))]


spark.conf.set('spark.sql.session.timeZone', 'UTC')
data_df2 = spark.createDataFrame([Row(date=utc_now)])
data_df2.show(10, False)
print(data_df2.collect())

+--------------------------+
|date |
+--------------------------+
|2018-02-12 20:41:16.270386|
+--------------------------+

[Row(date=datetime.datetime(2018, 2, 12, 21, 41, 16, 270386))]

正如您所看到的,Spark 将其视为 UTC,但在本地时区提供它,因为 Python 仍然具有时区“欧洲/巴黎”
import os, time
os.environ['TZ'] = 'UTC'
time.tzset()
utc_now = datetime.now()
spark.conf.set('spark.sql.session.timeZone', 'UTC')
data_df2 = spark.createDataFrame([Row(date=utc_now)])
data_df2.show(10, False)
print(data_df2.collect())

+--------------------------+
|date |
+--------------------------+
|2018-02-12 20:41:16.807757|
+--------------------------+

[Row(date=datetime.datetime(2018, 2, 12, 20, 41, 16, 807757))]

此外, pyspark.sql.module为您提供了两个函数来将时间戳对象转换为对应于一天中同一时间的另一个对象( from_utc_timesampto_utc_timestamp )。虽然我不认为你想改变你的日期时间。

关于python - 带有日期时间 tzaware 对象的 Pyspark 中的 TimeStampType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48746376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com