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

Har*_*rsh 5 datetime-format apache-spark apache-spark-sql pyspark

如何在spark中将字符串存储2018-03-21 08:15:00 +03:00为a timestamptype,保留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")
)
Run Code Online (Sandbox Code Playgroud)

此打印newtimestamp列的值转换为 UTC 时间,即2018-03-21 05:15:00

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

bla*_*hop 1

您需要使用以下命令将从转换中获得的时间戳格式化为所需的模式date_format

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|
#+--------------------------+-------------------+-------------------------+
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@blackbishop,正如你所看到的,时间会自动转换,并且最终结果中的偏移量不是+0300。我希望存储相同的日期和偏移量(+3),而不需要任何时间转换作为时间戳类型。是否可以? (2认同)
  • 是的,但我们在源中收到具有不同时间戳偏移的记录,即一条记录带有“2018-03-21 08:15:00 +03:00”,另一条记录带有“2019-05-21 00:15:00 +01” :00`。因此,我希望将记录存储为保留相同偏移值的时间戳类型,即第一个记录为+03,第二个记录为+01。如果我将“timezone”设置为任何特定位置,spark 会将原始日期时间转换为丢失原始偏移值的偏移量。 (2认同)