在Spark sql中保留区域Sting timestamp to Timestamp转换

46scxncf  于 12个月前  发布在  Apache
关注(0)|答案(1)|浏览(155)

有一个独特的要求,我想转换格式的字符串时间戳:2023-06-07T14:10:38.123+01:00,我试图使用格式'yyyy-MM-dd HH:mm:ss.SSSXXX'转换它转换为2023-06-07 13:10:38.123,但它是下降的时区+01:00.我想使字符串列时间戳和保持字符串格式相同2023-06-07T14:10:38.123+01:00 .我搜索了多个网站,但仍然无法找到如何保持相同的字符串.或者,如果这是一个不可行的要求,那么请分享你的经验.
spark.sql("select to_timestamp('2023-06-07T16:10:38.123+01:00', 'yyyy-MM-dd\\'T\\'HH:mm:ss.SSSXXX') as timestamp").show(truncate=false)它给了我这个:

+-----------------------+
|timestamp              |
+-----------------------+
|2023-06-07 16:10:38.123|
+-----------------------+
dfty9e19

dfty9e191#

给定字符串为:

2023-06-07T14:10:38.123+01:00

如果将其转换为TIMESTAMP,Spark会将其存储为UTC时间戳:

2023-06-07T13:10:38.123

或者更准确地说,是从epoch 1970-01-01 00:00:00 Z开始的秒数-总之,是UTC时区。Spark不存储原始时区信息。
如果你在Spark中显示时间戳,它使用默认的yyyy-MM-dd hh:mm:ss,使用会话时区。如果你的是'+01:00',它将简单地显示为:

2023-06-07T14:10:38.123

您可以显式地格式化时间戳并使用date_format函数添加偏移量信息:

spark.sql("select date_format(to_timestamp('2023-06-07T16:10:38.123+01:00', 'yyyy-MM-dd\\'T\\'HH:mm:ss.SSSXXX'), 'yyyy-MM-dd HH:mm:ss.SSSXXX')").show(truncate=false)

2023-06-07T14:10:38.123+01:00

相关问题