gpt4 book ai didi

python - 更改spark中的时间戳TZ

转载 作者:行者123 更新时间:2023-12-01 07:47:57 25 4
gpt4 key购买 nike

我有一个包含时间戳的日期帧(unix):

df = spark.createDataFrame(
[
(1527853209,),
(1527852466,),
(1527852178,),
(1527851689,),
(1527852214,),
],
["date_time"]
)

我使用下面的 Spark 配置:

OPT_SPARK = {
'master': 'yarn',
'spark.executor.extraJavaOptions': '-Duser.timezone=GMT',
'spark.driver.extraJavaOptions': '-Duser.timezone=GMT',
}

Without changing the spark options, I would like to convert my timestamp from "GMT" to "CET - Central Europe Time".

我尝试了以下代码:

from pyspark.sql import functions as F, types as T
from datetime import datetime
from dateutil import tz

def conv(in_ts):

from_zone = tz.gettz('GMT')
to_zone = tz.gettz('CET')

utc = datetime.utcfromtimestamp(in_ts)
utc = utc.replace(tzinfo=from_zone)
n_ts = utc.astimezone(to_zone).replace(tzinfo=None)

return n_ts


conv_udf = F.udf(conv, T.TimestampType())

当我测试该功能时它工作正常,但在 Spark 中则不然:

# 1527853209 is GMT: Friday 1 June 2018 11:40:09
conv(1527853209)
datetime.datetime(2018, 6, 1, 13, 40, 9)

df.select(
"date_time",
F.col("date_time").cast("timestamp"),
conv_udf("date_time")
).show()

+----------+-------------------+-------------------+
| date_time| date_time| conv(date_time)|
+----------+-------------------+-------------------+
|1527853209|2018-06-01 11:40:09|2018-06-01 11:40:09|
|1527852466|2018-06-01 11:27:46|2018-06-01 11:27:46|
|1527852178|2018-06-01 11:22:58|2018-06-01 11:22:58|
|1527851689|2018-06-01 11:14:49|2018-06-01 11:14:49|
|1527852214|2018-06-01 11:23:34|2018-06-01 11:23:34|
+----------+-------------------+-------------------+

我找不到任何内置函数来实现这一点,因此使用 UDF 似乎是最好的解决方案,但显然,它没有按预期工作。

预期结果:

+----------+-------------------+-------------------+
| date_time| date_time| conv(date_time)|
+----------+-------------------+-------------------+
|1527853209|2018-06-01 11:40:09|2018-06-01 13:40:09|
|1527852466|2018-06-01 11:27:46|2018-06-01 13:27:46|
|1527852178|2018-06-01 11:22:58|2018-06-01 13:22:58|
|1527851689|2018-06-01 11:14:49|2018-06-01 13:14:49|
|1527852214|2018-06-01 11:23:34|2018-06-01 13:23:34|
+----------+-------------------+-------------------+

最佳答案

我认为你所做的是正确的,但是当你使用 show() 打印结果时,你的 conv(date_time) 被转换为你的时区(GMT) )。

如果您唯一需要的是显示新时区 (CET) 中的日期时间,您可以将 udf 重写为 StringType:

def conv(in_ts):

from_zone = tz.gettz('GMT')
to_zone = tz.gettz('CET')

utc = datetime.utcfromtimestamp(in_ts)
utc = utc.replace(tzinfo=from_zone)
n_ts = utc.astimezone(to_zone)

return n_ts.strftime('%x %X')


conv_udf = F.udf(conv, T.StringType())

关于python - 更改spark中的时间戳TZ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56357575/

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