跳到主要内容

sequence:生成等差数列

速查结论

sequence(start, stop[, step]) 是 Spark SQL 中用于生成等差数列的函数。返回从 start 到 stop(包含 stop)的数组,步长为 step。支持数值类型(byte、short、integer、long)和日期/时间戳类型。注意:start > stop 时 step 必须为负数,反之亦然,否则会报错。

语法

sequence(start, stop[, step])

参数说明

参数说明
start范围的起始值。必须与 stop 类型一致
stop范围的结束值(包含在结果中)。必须与 start 类型一致
step可选,步长。默认值:start <= stop 时为 1,start > stop 时为 -1。对于日期类型,默认步长为 interval 1 day

返回值:包含从 start 到 stop(含 stop)、步长为 step 的等差数列数组。返回元素的类型与参数表达式类型相同。

支持的类型:byte、short、integer、long、date、timestamp。

Since: 2.4.0

示例

数值序列

-- 递增序列(默认步长为 1)
SELECT sequence(1, 5);
-- 结果: [1, 2, 3, 4, 5]

-- 递减序列(start > stop,默认步长为 -1)
SELECT sequence(5, 1);
-- 结果: [5, 4, 3, 2, 1]

-- 指定步长
SELECT sequence(0, 10, 2);
-- 结果: [0, 2, 4, 6, 8, 10]

-- 负步长
SELECT sequence(10, 0, -2);
-- 结果: [10, 8, 6, 4, 2, 0]

日期序列

-- 按天生成日期序列
SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'));
-- 结果: [2018-01-01, 2018-01-02, 2018-01-03, 2018-01-04, 2018-01-05]

-- 按月生成日期序列(interval 1 month)
SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month);
-- 结果: [2018-01-01, 2018-02-01, 2018-03-01]

-- year-month interval 写法
SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '0-1' year to month);
-- 结果: [2018-01-01, 2018-02-01, 2018-03-01]

时间戳序列

-- 按小时间隔生成时间戳序列
SELECT sequence(
to_timestamp('2018-01-01 00:00:00'),
to_timestamp('2018-01-01 03:00:00'),
interval 1 hour
);
-- 结果: [2018-01-01 00:00:00, 2018-01-01 01:00:00, 2018-01-01 02:00:00, 2018-01-01 03:00:00]

-- 按天生成时间戳序列
SELECT sequence(
to_timestamp('2024-01-01 00:00:00'),
to_timestamp('2024-01-03 00:00:00'),
interval 1 day
);

常见报错与避坑指南

start 和 stop 类型不一致

startstop 必须解析为相同的类型,否则会报错。

-- 错误写法:INT 和 STRING 类型不一致
SELECT sequence(1, '5');
-- AnalysisException: cannot resolve 'sequence(1, '5')' due to data type mismatch

-- 正确写法:类型一致
SELECT sequence(1, 5);
-- 结果: [1, 2, 3, 4, 5]

步长符号与范围方向不一致

start < stop 时,step 必须为正;当 start > stop 时,step 必须为负。符号不一致会导致报错。

-- 错误写法:递增范围用了负步长
SELECT sequence(1, 5, -1);
-- 报错: requirement failed: sequence step must be positive when start <= stop

-- 错误写法:递减范围用了正步长
SELECT sequence(5, 1, 1);
-- 报错: requirement failed: sequence step must be negative when start > stop

-- 正确写法:步长符号与方向一致
SELECT sequence(1, 5, 1); -- 递增 → 正步长
SELECT sequence(5, 1, -1); -- 递减 → 负步长

日期序列的 step 类型错误

当 start 和 stop 为 date 或 timestamp 类型时,step 必须是 interval 类型,不能是数值。

-- 错误写法:日期序列不能用数值作为步长
SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), 1);
-- AnalysisException: cannot resolve 'sequence(...)' due to data type mismatch

-- 正确写法:使用 interval
SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day);

step 为零导致无限循环

step 不能为 0,否则会导致无限循环。

-- 错误写法:步长为 0
SELECT sequence(1, 5, 0);
-- 报错: requirement failed: sequence step must not be zero
📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看