当前位置: 首页 > 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.dtcms.com/a/314070.html

相关文章:

  • 无人机路径规划技术要点与难点分析
  • 权限管理命令
  • 【C++】2. 类和对象(上)
  • Anthropic 禁止 OpenAI 访问 Claude API:商业竞争与行业规范的冲突
  • mongodb源代码分析创建db流程分析
  • 芯脑觉醒:Deepoc如何让送餐机器人“活”起来?
  • 手搓TCP服务器实现基础IO
  • Go语言高并发价格监控系统设计
  • TCP 协议的“无消息边界”(No Message Boundaries)特性
  • sqli-labs-master/Less-31~Less-40
  • 内联函数:提升效率的空间换时间艺术
  • 移动端 WebView 视频无法播放怎么办 媒体控件错误排查与修复指南
  • 官宣!多功能DC-DC数字电源控制器重磅首发
  • 应用药品GSP证书识别技术,提升药品流通各环节的合规管理效率和风控水平
  • 数据工程与处理:AI时代的数据基石与智能化管道
  • java~final关键字
  • doris `unicode` 是多语言混合类型分词与elasticsearch分词差异
  • Java从入门到精通 - 算法、正则、异常
  • MQTT:安装部署
  • 【AI 加持下的 Python 编程实战 2_13】第九章:繁琐任务的自动化(中)——自动批量合并 PDF 文档
  • CMake进阶: 使用FetchContent方法基于gTest的C++单元测试
  • Docker-07.Docker基础-数据卷挂载
  • 在CAPL自动化脚本中巧用panel函数
  • 关键领域软件研发如何构建智能知识管理体系?从文档自动化到安全协同的全面升级
  • 实现Trie(前缀和)C++
  • 【REACT18.x】封装react-rouer实现多级路由嵌套,封装登录态权限拦截
  • PyTorch :三角函数与特殊运算
  • python:讲懂决策树,为理解随机森林算法做准备,以示例带学习,通俗易懂,容易理解和掌握
  • 张 事实关注增强模型:提升AI准确率新方法
  • 设备电机状态监测中的故障诊断与定位策略