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

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.xdnf.cn/news/17145.html

相关文章:

  • LeetCode 135:分糖果
  • Vue3学习笔记
  • AI小说创作工具体验:本地部署助力文学创作,Ollama+AIStarter一键搞定
  • Prompt Engineering
  • 嵌入式硬件篇---OpenMV存储
  • 疏老师-python训练营-Day35模型可视化推理
  • 华奥系科技奥采01:重新定义物联网数据采集标准
  • OpenLayers 详细开发指南 - 第八部分 - GeoJSON 转换与处理工具
  • DC-DC的分压反馈电阻怎么取值
  • 16_OpenCV_漫水填充(floodFill)
  • 最大重复子字符串
  • 数据分页异步后台导出excel
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 85(题目+回答)
  • JMeter的基本使用教程
  • HarmonyOS 多屏适配最佳实践:基于 ArkUI 的响应式 UI 方案
  • 深入理解Java的SPI机制,使用auto-service库优化SPI
  • 北京JAVA基础面试30天打卡01
  • Neo4j 社区版 Mac 安装教程
  • 从HTTP到WebSocket:打造极速实时通讯体验
  • [3D数据存储] Archive (File Container) | 创建/写入/读取 | 存储格式HDF5
  • RocketMQ与Kafka 消费者组的‌重平衡操作消息顺序性对比
  • 低空三维多物理场耦合风洞试验,保证飞行器的性能安全是低空飞行的底线,是低空经济发展的基础
  • Ethereum: 深度解析Web3世界的合规之门, ERC-1400证券型代币标准
  • Apache Camel 中 ProducerTemplate
  • Hadoop HDFS 3.3.4 讲解~
  • C++信息学奥赛一本通-第一部分-基础一-第一章
  • 微信小程序本地存储与Cookie的区别
  • 架构进阶——解读45页企业架构管理方法与需求受理流程【附全文阅读】
  • AI绘图-Stable Diffusion-WebUI的基本用法
  • Node.js(四)之数据库与身份认证