当前位置: 首页 > news >正文

SparkSQL—sequence 函数用法详解

SparkSQL— sequence 函数用法详解

sequence 是 Apache Spark SQL 中的一个内置函数,从 Spark 2.4.0 版本开始支持。

用于生成一个等差序列数组,可以是数值型(如整数、长整型)或时间类型(如日期、时间戳)的序列。

官网:https://spark.apache.org/docs/latest/api/sql/index.html#sequence

在这里插入图片描述


sequence(start, stop, step)
  • start: 起始值(包含)
  • stop: 结束值(包含)
  • step: 步长(可选),默认为 1-1,取决于 startstop 的大小关系

⚠️ tips:stop包含的(inclusive),这与很多编程语言中的 range 不同。


支持的数据类型:

类型示例
byte, short, integer, longsequence(1, 5)[1,2,3,4,5]
datesequence(date'2023-01-01', date'2023-01-05')
timestampsequence(timestamp'2023-01-01 00:00:00', ..., interval 1 hour)

参数规则:

规则说明
startstop 必须同类型不能混合类型,如 intlong 可以隐式转换,但 datetimestamp 不行
step 类型要求
- 数值类型:step 必须是 byte/short/int/longsequence(1, 10, 2)
- 时间类型(date/timestamp):step 必须是 interval 类型interval 1 month, interval '2' day
步长方向
- 若 start <= stopstep 必须 ≥ 0(默认为 1)
- 若 start > stopstep 必须 < 0(默认为 -1)
时间类型的默认步长
- date: 1 day-1 day
- timestamp: 1 second-1 second

Demo:

1. 数值序列(整数)

SELECT sequence(1, 5);
-- 结果: [1, 2, 3, 4, 5]SELECT sequence(5, 1);
-- 结果: [5, 4, 3, 2, 1]

在这里插入图片描述

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

在这里插入图片描述


2. 日期序列

SELECT sequence(to_date('2023-01-01'), to_date('2023-01-05')
);
-- 结果: ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']SELECT sequence(to_date('2023-01-01'), to_date('2023-03-01'), interval 1 month
);
-- 结果: ['2023-01-01', '2023-02-01', '2023-03-01']

在这里插入图片描述


3. 时间戳序列

SELECT sequence(timestamp'2023-01-01 00:00:00', timestamp'2023-01-01 03:00:00', interval 1 hour
);
-- 结果: ['2023-01-01 00:00:00', '2023-01-01 01:00:00', '2023-01-01 02:00:00', '2023-01-01 03:00:00']

在这里插入图片描述


4. 年月间隔(Year-Month Interval)

SELECT sequence(to_date('2023-01-01'), to_date('2023-12-01'), interval '0-1' year to month
);
-- 每月1号,共12个月

'0-1' year to month

部分含义
0表示 0 年
1表示 1 个月
year to month表示这个间隔精确到“年-月”级别(不包括天、小时等)

'0-1' year to month = 增加 1 个月

等价写法:

interval 1 month

假设你有一张销售表,只有某些月份有数据:

monthsales
2023-01-01100
2023-03-01150
2023-06-01200

补全所有月份(没有数据的设为 0)——先用 sequence 生成完整月份列表,然后 LEFT JOIN

WITH all_months AS (SELECT explode(sequence(to_date('2023-01-01'), to_date('2023-12-01'), interval 1 month)) AS month
)
SELECT am.month,COALESCE(s.sales, 0) AS sales
FROM all_months am
LEFT JOIN sales_table s ON am.month = s.month
ORDER BY am.month;

5. 负步长(递减序列)

SELECT sequence(10, 5, -1);
-- [10, 9, 8, 7, 6, 5]SELECT sequence(to_date('2023-03-01'), to_date('2023-01-01'), interval -1 month);
-- ['2023-03-01', '2023-02-01', '2023-01-01']

在这里插入图片描述


常见错误用法:

| start < stopstep < 0 | | start > stopstep > 0 |

在这里插入图片描述

| 类型不匹配 | 类型错误 | | 时间序列使用非 interval 步长 |

在这里插入图片描述

在这里插入图片描述


tips:配合explode函数 还是很好用的~

最后来道面试题:

将格式为 ‘1-5,16,11-13,9’ 的字符串展开为单独的数字,并保留原始位置信息。
预期结果:‘1,2,3,4,5,16,11,12,13,9’

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

整体代码:

在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/610412.html

相关文章:

  • 四、Linux 的实用操作
  • wpf Image 转 90 度
  • 华为OD机考2025C卷 - 分配土地 (Java Python JS C++ C )
  • 复合机器人抓取精度怎么测量?
  • Tableau筛选器所有值与总和的差异:同一度量,两重世界
  • 【教学类-52-17】20250803动物数独_空格尽量分散_只有一半关卡数(N宫格通用版3-10宫格)0图、1图、2图、6图、有答案、无答案 组合版24套
  • 内网有人下载导致网速很慢怎么找出来?
  • Vue3核心语法进阶(生命周期)
  • MySQL InnoDB 表数据结构存储方式详解
  • 川翔云电脑:引领开启算力无边界时代
  • 数学 理论
  • 哪些企业需要私有化部署?有没有推荐的私有化im
  • 段落注入(Passage Injection):让RAG系统在噪声中保持清醒的推理能力
  • [Shell编程] 零基础入门 Shell 编程:从概念到第一个脚本
  • 【RH124知识点问答题】第8章 监控和管理 Linux 进程
  • Linux 磁盘管理详解:分区、格式化与挂载全流程指南
  • 内联函数:提升效率的空间换时间艺术
  • C++面试题及详细答案100道( 01-10 )
  • mongodb源代码分析创建db流程分析
  • 【论文阅读】ACE: Explaining cluster from an adversarial perspective
  • Makefile文件写法模板
  • 数据与模型优化随机森林回归进行天气预测
  • CLM陆面过程模式实践技术应用
  • 攻防世界-Mobile-easyjni
  • 8.高斯混合模型
  • 基于Springboot+Mybatis+thymeleaf的个人博客系统的设计与实现
  • 监控插件(二)prometheus(2)API CounterGauge
  • Linux下PXE服务器搭建
  • EdgeView for macOS:解决图像管理痛点的利器
  • 【BUUCTF系列】[极客大挑战 2019]LoveSQL 1