Spark SQL如何给timestamp添加动态天数并仍返回timestamp类型
解决方案
Spark SQL中直接写interval N days仅支持静态常量,不支持动态表达式/列值,要实现动态加指定天数且返回值为timestamp类型、保留完整时分秒精度,可使用以下两种方案:
方案1:使用make_interval函数(Spark 3.0+ 推荐)
该函数支持传入动态计算值、字段值作为间隔参数,返回结果为timestamp类型:
-- 示例:动态计算加2天 SELECT col1 + make_interval(days => (5-3)) AS res FROM VALUES make_timestamp(2021, 12, 28, 6, 30, 45.887) AS t(col1); -- 支持传入列名作为动态天数参数 SELECT col1 + make_interval(days => day_col) AS res FROM your_table;
上述示例返回结果为2021-12-30 06:30:45.887,完整保留原时间的时分秒、毫秒精度。
方案2:低版本Spark兼容方案(毫秒级计算)
如果使用的Spark版本低于3.0没有make_interval函数,可通过转换为时间戳毫秒数计算后再转回timestamp实现:
SELECT to_timestamp(unix_millis(col1) + (5-3)*86400*1000) AS res FROM VALUES make_timestamp(2021, 12, 28, 6, 30, 45.887) AS t(col1);
其中86400为一天的秒数,乘以1000转换为毫秒单位,同样支持替换为列值实现动态天数计算。
内容的提问来源于stack exchange,提问作者Kozmo
相关产品推荐
相关产品推荐

