我试图转换字符串来自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中提取时间都很好,但当我从提取偏移量中使用强制转换时,效果就不好了。
有没有更好的方法来处理如何在时间戳中包含偏移值?
2条答案
按热度按时间68de4m5k1#
有一个专用的
x
pattern用于区域偏移,所以解析字符串值就像下面这样简单:xtupzzrd2#
在Spark SQL中,INTERVAL关键字通常需要一个常量或一个具有适当间隔类型的列值。因此在使用INTERVAL之前将CAST作为INT在这种情况下不直接起作用。
你需要做的是:
我会把sql改成
to_timestamp()
函数将字符串的日期时间部分转换为时间戳。from_utc_timestamp()
函数将时区偏移应用于时间戳。它需要使用字符串操作创建的格式为'GMT+0100'的时区。因此from_utc_timestamp
函数将时间戳视为UTC并将其转换为指定时区的本地时间。这将正确地将偏移量添加到时间。