新闻详情

新闻详情

首页 / 资讯中心 / 详情

StarRocks array_slice 数组切片函数完全指南:语法、参数、边界行为与源码实现剖析

发布时间:2026/9/18 7:30:48来源:尧图网络
StarRocks array_slice 数组切片函数完全指南:语法、参数、边界行为与源码实现剖析
StarRocks array_slice 数组切片函数完全指南语法、参数、边界行为与源码实现剖析【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks数组切片Array Slicing是 SQL 分析中最常用的数组处理手段之一。StarRocks 内置的array_slice函数允许你从一个数组中按起始位置和长度截取子数组用于日志解析、会话行为分段、时间序列滑窗提取等场景。本文以 StarRocks 官方文档 array_slice.md 为核心骨架结合 BE 端向量化实现源码与单元测试系统讲解该函数的语法、参数约束、边界行为、NULL 语义以及底层调用链帮助你准确、高效地在 SQL 中使用数组切片。函数概览array_slice用于从输入数组input中、以offset指定的起始位置开始截取长度为length的一段元素返回与原数组同类型的子数组。其行为可以类比为 Python 的list[start:startlength]但起始位置从 1 计数而非 0。array_slice(input, offset, length)三个参数全部必填且offset与length必须为 BIGINT 类型。函数属于 StarRocks 的向量化数组函数族在 BE 端由 array_functions.cpp 中的ArrayFunctions::array_slice实现并在 array_functions.h 中通过DEFINE_VECTORIZED_FN(array_slice)注册到函数体系。参数详解参数类型要求语义取值约束input数组元素类型见下文待截取的源数组支持 BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、LARGEINT、FLOAT、DOUBLE、VARCHAR、DECIMALV2、DATETIME、DATE、JSON 等元素类型JSON 自 StarRocks 2.5 起支持offsetBIGINT起始截取位置有效值从 1 开始计数lengthBIGINT需要截取的元素个数无显式上限超出实际可截取长度时按“能截多少截多少”处理元素类型覆盖从官方文档给出的支持列表可以看出array_slice覆盖了 StarRocks 绝大多数标量类型数值类整型、浮点、DECIMAL、字符串VARCHAR、时间类DATETIME、DATE、布尔、以及 2.5 版本新增的 JSON。这意味着一份通用的切片逻辑可以透明地作用于不同类型的数组无需为每种类型单独编写分支。offset 与 length 的 BIGINT 约束offset和length被严格要求为 BIGINT即 64 位有符号整数。在 BE 端实现中这两个参数分别被解析为Int64Column当offset为 NULL 或length为 NULL 时结果行的对应位置会置 NULL见下文 NULL 语义常量参数会通过ColumnHelper::unpack_and_duplicate_const_column展开为与批处理行数一致的列从而兼容“整列传入”与“每行不同 offset/length”两种用法。返回值与数据类型函数返回一个数组其元素数据类型与input参数指定的数组元素类型完全一致。也就是说切片不会改变元素类型——ARRAYINT切出来的仍是ARRAYINTARRAYVARCHAR切出来的仍是ARRAYVARCHAR。这一点在单元测试中有充分体现测试 array_functions_test.cpp 分别针对TYPE_ARRAY_INT、TYPE_ARRAY_BIGINT、TYPE_ARRAY_FLOAT、TYPE_ARRAY_DOUBLE、TYPE_ARRAY_VARCHAR构造输入列调用ArrayFunctions::array_slice后逐一断言结果列的元素类型与值例如array_slice_int用例断言结果仍是int32_t数组array_slice_varchar用例断言结果仍是SliceVARCHAR 的内部表示数组。使用注意事项起始位置从 1 开始offset的有效取值从 1 开始。第一个元素的位置是 1而不是 0。这与 SQL 社区中“数组下标从 1 开始”的惯例一致避免与编程语言的 0 基索引混淆。长度超出时返回全部可截取元素当length超过从offset起实际可截取的元素个数时函数不会报错而是返回从offset到数组末尾的全部元素。这是最容易踩坑也最常被依赖的行为详见下文示例 4。NULL 元素被当作普通值参与切片数组内部的 NULL 元素如[128.55, null, 324.2]中的null被视为正常元素它们占据位置、参与计数并在切片结果中原样保留不会被剔除或引发错误。这与某些数据库“NULL 即不存在”的语义有本质区别需要特别注意。示例演示以下示例均基于 StarRocks mysql 客户端实测输出。示例 1从第三个元素开始截取 2 个元素mysql select array_slice([1,2,4,5,6], 3, 2) as res; ------- | res | ------- | [4,5] | -------数组[1,2,4,5,6]中第 3 个元素是4从它开始连续取 2 个得到[4,5]。示例 2从第一个元素开始截取 2 个元素字符串数组mysql select array_slice([sql,storage,query,execute], 1, 2) as res; ------------------- | res | ------------------- | [sql,storage] | -------------------array_slice同样适用于 VARCHAR 数组常用于从标签列表、路径分段、单词序列中提取前缀或头部片段。示例 3NULL 元素被视为普通值mysql select array_slice([57.73,97.32,128.55,null,324.2], 3, 3) as res; --------------------- | res | --------------------- | [128.55,null,324.2] | ---------------------数组的第 3 个元素是128.55其后依次是null和324.2共 3 个元素。结果中的null被完整保留。示例 4length 超出实际可截取个数mysql select array_slice([57.73,97.32,128.55,null,324.2], 3, 5) as res; --------------------- | res | --------------------- | [128.55,null,324.2] | ---------------------本意是从第 3 个元素开始截取 5 个但数组从第 3 个位置起只剩 3 个元素128.55、null、324.2。函数按“能截多少截多少”的原则返回这全部 3 个元素而不是报错或补 NULL。边界行为与源码实现剖析仅掌握语法不足以写出健壮的查询理解array_slice在极端输入下的行为同样关键。以下行为均可从 array_functions.cpp 的_array_slice_item模板实现与 array_functions_test.cpp 的测试用例中得到印证。核心算法三段式截取_array_slice_item是逐行处理的核心函数其逻辑可拆解为三步定位起始偏移offset为正数时执行--offset把 1 基下标转成 0 基下标若offset为负数则执行offset item_size等价于“从数组末尾倒数”这是实现层保留的扩展能力计算结束位置end max(0, min(item_size, offset length))即结束位置被钳制在数组长度范围内这正是“长度超出则返回全部可截取元素”的根源裁剪非法区间offset max(offset, 0)且当end offset时截取长度为 0避免负长度访问越界。offset 为 0 时返回空数组实现中有一句if (!offset) { dest_offsets.emplace_back(dest_offsets.back()); return; }当offset为 0 时直接向结果追加一个与上一行相同的偏移量即返回空数组[]。测试array_slice_int中第 8 行offset -8超出数组长度的结果正是空数组{}对应了这一防护逻辑。每行独立的 offset 与 lengtharray_slice支持批处理语义——每一行可以使用不同的offset和length。测试array_slice_int构造了 8 行输入每行 offset 分别为1, 2, 3, 1, 2, -2, -7, -8length 各不相同结果逐行校验。这意味着你可以在一个SELECT中让不同的行基于各自的业务逻辑参数化截取区间。NULL 传播语义整行 NULL若源数组本身为 NULL结果行保持 NULL测试中Datum()输入对应dest_column-get(3).is_null()为 true参数 NULLoffset或length为 NULL 时结果行置 NULL源码中通过FunctionHelper::union_null_column将各参数的 NULL 位图合并进结果 NULL 列元素 NULL数组内部的 NULL 元素作为普通元素参与切片如测试array_slice_int第 5 行[4, null, 2, 1]从 offset2 取 2 个元素结果是[null, 2]——元素 NULL 被保留而行本身非 NULL。向量化与列式处理从源码可以看到ArrayFunctions::array_slice的输入输出都是列ColumnPtr通过ColumnHelper::unpack_and_duplicate_const_column处理常量列通过down_cast将列转为ArrayColumn/Int64Column后批量循环处理每一行。整个处理过程基于 StarRocks 的列式存储与 SIMD 友好的内存布局无需逐行解释执行这也是数组类函数在高并发分析场景下保持性能的底层原因。从源码结构看切片结果通过dest_data_column-append将源数组元素连续追加到结果列属于零拷贝式的元素搬迁避免了逐元素构造的开销。常见应用场景会话行为分段将用户行为序列如点击流数组按时间窗口切成前段、中段、后段用于漏斗分析Top-N 标签提取配合array_sort等函数先排序再用array_slice(arr, 1, 3)提取最重要的前 3 个标签日志字段拆分对split产生的分词数组取中间片段提取 URL 路径或日志特征滑窗特征工程从序列数据中截取固定长度的子序列作为机器学习模型的输入特征。关联阅读函数入口与向量化注册array_functions.h核心实现array_functions.cpp单元测试覆盖 int/bigint/float/double/varchar 及仅 offset 变体array_functions_test.cpp官方文档原始出处array_slice.md如果你需要截取数组到末尾不带 length 约束可在 SQL 中传入一个足够大的 length或者留意源码中columns.size() 2分支所预留的“仅 offset”两参数调用形态——从实现与测试看array_slice(input, offset)的二参形式在 BE 层已具备完整支持对应_array_slice_itemfalse分支可结合你所使用版本的语法说明确认是否可直接使用。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OP_OPTION 宏详解:CANN opbase 中算子精度模式的封装与 OpImplMode 使用指南 2026/9/18 8:13:13

OP_OPTION 宏详解:CANN opbase 中算子精度模式的封装与 OpImplMode 使用指南

OP_OPTION 宏详解:CANN opbase 中算子精度模式的封装与 OpImplMode 使用指南 【免费下载链接】opbase 本项目是CANN算子库的基础框架库,为算子提供公共依赖文件和基础调度能力。 项目地址: https://gitcode.com/cann/opbase 导读 OP_OPTION 是 C…

阅读更多 →
Spring Security OAuth2单点登录:授权码+JWT+LDAP 2026/9/18 8:13:13

Spring Security OAuth2单点登录:授权码+JWT+LDAP

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
星闪NearLink技术解析:低延迟无线通信的国产方案与开发实践 2026/9/18 8:13:13

星闪NearLink技术解析:低延迟无线通信的国产方案与开发实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
跨境电商图片翻译工具选型与优化指南 2026/9/18 8:13:13

跨境电商图片翻译工具选型与优化指南

1. 跨境电商图片翻译的核心痛点做跨境电商的朋友都知道,商品图片上的文字信息直接影响转化率。但面对不同语言市场的需求,直接替换图片成本太高,而简单粗暴的机器翻译又经常闹笑话。去年我们团队上线日本站时就踩过坑——某款保温杯图片上的&…

阅读更多 →
边缘计算实战:从colibri项目看边缘AI推理网关设计与部署 2026/9/18 8:13:13

边缘计算实战:从colibri项目看边缘AI推理网关设计与部署

做边缘计算这一行的人,大概率听过一个项目代号:colibri。国内很多技术社区把它音译成“科利布里”,也有人直接叫“蜂鸟项目”。这个词的本意是西班牙语里的“蜂鸟”,但在这个语境下,它指的是 HPE(惠普企业&…

阅读更多 →
Linux设备驱动模型核心原理与实战 2026/9/18 8:10:12

Linux设备驱动模型核心原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞