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

xyhw6mcr  于 2023-10-23  发布在  Apache
关注(0)|答案(2)|浏览(141)

我试图转换字符串来自s3/csv文件到极光mysql使用sparksql(Spark集群3.0)使用胶水
CSV中的现有字符串值:20231021134021+0100预期时间戳:2023-10-21 14:40:21(添加了小时到时间的偏移量)

from awsglue.dynamicframe import DynamicFrame

# Use Spark SQL to parse the date-time string and add the time zone offset
spark_sql = glueContext.sql("""
    SELECT
           DATE_ADD(
               to_timestamp(SUBSTRING(your_datetime_column, 1, 14), 'yyyyMMddHHmmss'),
               INTERVAL CAST(SUBSTRING(your_datetime_column, 15, 2) AS INT) HOURS
               + CAST(SUBSTRING(your_datetime_column, 17, 2) AS INT) MINUTES
           ) AS 
    FROM my_data
""")

result_df = spark.sql(spark_sql)

result_dyf = DynamicFrame.fromDF(result_df, glueContext, "result_dyf")

我得到了一个解析错误,INTERVAL不支持强制转换吗?如果我只是像下面这样使用till时间戳

select to_timestamp(SUBSTRING(your_datetime_column, 1, 14), 'yyyyMMddHHmmss') from my_data

或者select to_timestamp(SUBSTRING(your_datetime_column,1,14),'yyyyMMddHHmmss')+ INTERVAL 1从my_data中提取时间都很好,但当我从提取偏移量中使用强制转换时,效果就不好了。
有没有更好的方法来处理如何在时间戳中包含偏移值?

68de4m5k

68de4m5k1#

有一个专用的xpattern用于区域偏移,所以解析字符串值就像下面这样简单:

spark.sql("""select to_timestamp('20231021134021+0100', 'yyyyMMddHHmmssxx') as ts""").show
+-------------------+
|                 ts|
+-------------------+
|2023-10-21 14:40:21|
+-------------------+
xtupzzrd

xtupzzrd2#

在Spark SQL中,INTERVAL关键字通常需要一个常量或一个具有适当间隔类型的列值。因此在使用INTERVAL之前将CAST作为INT在这种情况下不直接起作用。
你需要做的是:

  • 将日期-时间字符串解析为时间戳。
  • 将UTC偏移量添加到解析的时间戳。

我会把sql改成

# SQL query to transform the data
spark_sql = glueContext.sql("""
    SELECT
        from_utc_timestamp(
            to_timestamp(SUBSTRING(your_datetime_column, 1, 14), 
         'yyyyMMddHHmmss'),
            CONCAT('GMT', SUBSTRING(your_datetime_column, 15, 5))
        ) AS timestamp_with_offset
    FROM my_data
""")

to_timestamp()函数将字符串的日期时间部分转换为时间戳。
from_utc_timestamp()函数将时区偏移应用于时间戳。它需要使用字符串操作创建的格式为'GMT+0100'的时区。因此from_utc_timestamp函数将时间戳视为UTC并将其转换为指定时区的本地时间。
这将正确地将偏移量添加到时间。

相关问题