AWS Glue作业Spark SQL无法将int类型秒数添加至timestamp字段
问题原因
- 使用的
date_add函数功能为给日期/时间值添加天数,不支持秒级运算,同时要求第一个参数为date/timestamp类型,第二个参数为代表天数的int类型,你的传参顺序完全颠倒,不符合类型要求,因此触发类型不匹配报错。 - 你需要的是timestamp秒级运算,应使用Spark SQL支持秒级时间调整的专用函数。
解决方法
写法1:使用timestampadd函数(推荐)
Spark SQL内置的timestampadd函数支持自定义时间单位的加减运算,语法为timestampadd(单位, 增量值, 原始时间戳),你的查询修正为如下即可:
spark.sql("SELECT abc.a, abc.b, abc.c, timestampadd(SECOND, abc.field1, abc.field2) AS d FROM abc")
参数说明:
- 第一个参数填
SECOND,指定运算单位为秒 - 第二个参数填int类型的秒数字段
abc.field1 - 第三个参数填原始timestamp类型字段
abc.field2
返回结果为timestamp类型,完全符合预期:输入2021-08-05 04:00:00加30秒,输出为2021-08-05 04:00:30。
写法2:使用INTERVAL运算
也可以通过时间间隔乘法实现相同效果:
spark.sql("SELECT abc.a, abc.b, abc.c, abc.field2 + INTERVAL 1 SECOND * abc.field1 AS d FROM abc")
补充说明
- 若
field1为负数,两种写法都会自动执行减秒运算,无需额外处理。 - 注意Spark SQL的查询语句需要用字符串包裹,你原写法中
spark.sql(select ...)未给SQL语句加引号,也会触发语法错误,上述修正写法已补上对应的双引号。
内容的提问来源于stack exchange,提问作者ASingh
相关产品推荐
相关产品推荐

