Apache spark 将具有UTC偏移量的字符串转换为spark时间戳

Apache spark 将具有UTC偏移量的字符串转换为spark时间戳,apache-spark,pyspark,apache-spark-sql,datetime-format,Apache Spark,Pyspark,Apache Spark Sql,Datetime Format,如何将字符串2018-03-21 08:15:00+03:00存储为timestamptype,并在spark中保留UTC偏移 在下面试用 from pyspark.sql.functions import * df = spark.createDataFrame([("2018-03-21 08:15:00 +03:00",)], ["timestamp"]) newDf= df.withColumn("newtimestamp",

如何将字符串
2018-03-21 08:15:00+03:00
存储为
timestamptype
,并在spark中保留UTC偏移

在下面试用

from pyspark.sql.functions import *

df = spark.createDataFrame([("2018-03-21 08:15:00 +03:00",)], ["timestamp"])
newDf= df.withColumn("newtimestamp", to_timestamp(col('timestamp'), "yyyy-MM-dd HH:mm:ss XXX")
)
这将打印值转换为UTC时间的
newtimestamp
列,即
2018-03-21 05:15:00


如何将此字符串存储为数据帧保留偏移量中的时间戳列,即将同一字符串存储为时间戳或存储为
2018-03-21 08:15:00+3000

您需要使用
date\u格式将从转换中获得的时间戳格式化为所需模式:

newDf = df.withColumn(
    "newtimestamp",
    to_timestamp(col('timestamp'), "yyyy-MM-dd HH:mm:ss XXX")
).withColumn(
    "newtimestamp_formatted",
    date_format("newtimestamp", "yyyy-MM-dd HH:mm:ss Z")
)

newDf.show(truncate=False)

#+--------------------------+-------------------+-------------------------+
#|timestamp                 |newtimestamp       |newtimestamp_formatted   |
#+--------------------------+-------------------+-------------------------+
#|2018-03-21 08:15:00 +03:00|2018-03-21 06:15:00|2018-03-21 06:15:00 +0100|
#+--------------------------+-------------------+-------------------------+

感谢@Blackishop,因为您可以看到时间会自动转换,最终结果中的偏移量不是+0300。我希望将相同的日期和偏移量(+3)存储为时间戳类型,而不进行任何时间转换。可能吗?是的,但我们在源中接收到具有不同时间偏移量的记录,即一条记录具有
2018-03-21 08:15:00+03:00
,另一条记录具有
2019-05-21 00:15:00+01:00
。因此,我希望将记录存储为保留相同偏移值的timestamptype,即第一条记录为+03,第二条记录为+01。如果我将
时区设置为任何特定位置,spark会将原始日期时间转换为该偏移量,从而丢失原始偏移量值。