ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

StarRocks arrays_zip 函数详解:按索引合并数组为 STRUCT 数组

2026/9/18 6:40:10 拓冰建站 浏览量
StarRocks arrays_zip 函数详解:按索引合并数组为 STRUCT 数组 StarRocks arrays_zip 函数详解按索引合并数组为 STRUCT 数组【免费下载链接】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导读arrays_zip是 StarRocks 提供的数组函数之一其核心能力是按索引位置将多个输入数组拉链式合并为一个ARRAYSTRUCT合并后第 n 个 STRUCT 元素恰好包含所有输入数组的第 n 个值。它在多列数组对齐、异构数据配对、以列为单位构造结构化记录等场景中非常实用。读完本文你将完整掌握arrays_zip的语法、参数约束、返回值语义、NULL 填充规则并通过源码级分析理解其底层向量化实现与类型推断机制可直接在 StarRocks 中落地使用。函数签名与语义arrays_zip将多个数组按索引合并为一个 STRUCT 数组其语法为arrays_zip(array_1, array_2[, ...])功能语义按索引合并给定数组。结果数组中第 n 个 STRUCT 包含所有输入数组的第 n 个元素当各数组长度不一致时缺失位置以 NULL 填充。参数array_n待合并的数组每个数组的元素可以是任意受支持的类型INT、VARCHAR、FLOAT、DECIMAL、日期类型、甚至嵌套 ARRAY/STRUCT 等且允许各数组元素类型不同。返回值ARRAYSTRUCT。结果 STRUCT 的字段名自动命名为col1、col2、……依次对应第 1、第 2 个输入数组字段名由实现自动生成用户无需也不能自定义。从 FE 侧的注册信息看该函数在 PolymorphicFunctionAnalyzer.java 中通过FunctionSet.ARRAYS_ZIP绑定到ArraysZipDeduce类型推断器属于多态函数Polymorphic Function其返回类型需要根据实际传入的数组类型组合来推导这也是它能支持每个数组元素类型不同的根本原因。使用规则Usage Notes若输入数组长度不同结果数组的长度等于所有输入数组中的最大长度较短数组的缺失位置填充 NULL。若某个输入数组整体为 NULL则整行结果为 NULL。若所有输入数组均为空数组则结果为空数组[]。输入数组可以为任意受支持类型且允许多个数组类型互不相同。以上规则与 BE 端向量化实现的逻辑一一对应可参见下文底层实现一节。完整示例以下示例均可在 StarRocks 的 MySQL 客户端中直接执行验证。示例 1合并两个等长数组mysql SELECT arrays_zip([1, 2], [a, b]) AS result; --------------------------------------------------- | result | --------------------------------------------------- | [{col1:1,col2:a},{col1:2,col2:b}] | ---------------------------------------------------示例 2合并两个长度不同的数组较短数组补 NULLmysql SELECT arrays_zip([1, 2], [a, null, c]) AS result; ----------------------------------------------------------------------------- | result | ----------------------------------------------------------------------------- | [{col1:1,col2:a},{col1:2,col2:null},{col1:null,col2:c}] | -----------------------------------------------------------------------------注意这里的长度差异同时带来了两层 NULL——第二个数组在第 2 个位置原本就存在元素null原样保留第 3 个位置则是因第一个数组长度不足而补齐的 NULL。示例 3合并三个数组mysql SELECT arrays_zip([1, 2, 3], [a, b, c], [10, 20, 30]) AS result; --------------------------------------------------------------------------------------------------------------- | result | --------------------------------------------------------------------------------------------------------------- | [{col1:1,col2:a,col3:10},{col1:2,col2:b,col3:20},{col1:3,col2:c,col3:30}] | ---------------------------------------------------------------------------------------------------------------可见字段名按输入顺序自动编号为col1、col2、col3。示例 4合并两个空数组mysql SELECT arrays_zip([], []) AS result; -------- | result | -------- | [] | --------示例 5仅合并单个数组mysql SELECT arrays_zip([1, 2, 3]) AS result; ------------------------------------------ | result | ------------------------------------------ | [{col1:1},{col1:2},{col1:3}] | ------------------------------------------即使只传入一个数组结果仍是ARRAYSTRUCT每个元素为仅含col1字段的 STRUCT。示例 6存在 NULL 数组mysql SELECT arrays_zip(null, [1, 2]) AS result; -------- | result | -------- | NULL | --------示例 7混合类型且含 NULL 元素的数组mysql SELECT arrays_zip([1, null, 3], [a, b, null]) AS result; ----------------------------------------------------------------------------- | result | ----------------------------------------------------------------------------- | [{col1:1,col2:a},{col1:null,col2:b},{col1:3,col2:null}] | -----------------------------------------------------------------------------示例 8合并表中数据典型实战场景mysql CREATE TABLE IF NOT EXISTS test (id INT, arr1 ARRAYINT, arr2 ARRAYVARCHAR) PROPERTIES (replication_num1); mysql INSERT INTO test VALUES (1, [1, 2], [a, b]), (2, [3, 4, 5], [x, y]); mysql SELECT id, arrays_zip(arr1, arr2) AS result FROM test; ---------------------------------------------------------------------------------- | id | result | ---------------------------------------------------------------------------------- | 1 | [{col1:1,col2:a},{col1:2,col2:b}] | | 2 | [{col1:3,col2:x},{col1:4,col2:y},{col1:5,col2:null}] | ----------------------------------------------------------------------------------示例 8 展示了实际业务中最常见的用法两张列对齐的数组列如商品 ID 列表与价格列表、坐标 x 列表与 y 列表通过arrays_zip逐行合并为结构化的键值记录方便后续展开或按字段访问。底层实现原理源码级分析arrays_zip在 BE 端的向量化实现位于 array_functions.cpp函数声明注册在 array_functions.h 的DEFINE_VECTORIZED_FN(arrays_zip)中属于 StarRocks 的向量化数组函数族。其执行流程与文档语义严格一致参数校验通过RETURN_IF_COLUMNS_ONLY_NULL(columns)处理全 NULL 输入的短路路径若columns.empty()直接返回arrays_zip function requires at least one argument错误即至少需要传入一个数组对应示例 5 的单数组场景。常量列解包unpack_and_duplicate_const_column将常量列展开为与行数一致的数据列随后校验所有列行数一致否则报All arrays must have the same size。STRUCT 字段构建为每个输入数组创建同构的空字段列clone_empty字段名统一生成为col (i 1)源码第 2031-2032 行这正是结果中col1、col2命名的来源。逐行 zip 主循环源码第 2040-2083 行先检查该行任一输入数组是否为 NULL若是则整行结果置 NULL对应示例 6 与使用规则第三条否则计算该行所有数组的最大长度max_length对应结果长度为最大输入长度按元素下标elem_idx遍历到max_length元素存在则从原数组对应偏移追加该元素元素不存在短数组越界则调用field_column-append_default()追加默认值 NULL对应使用规则第一、二条。结果组装将 STRUCT 列包装为可空列后构造ArrayColumn最后通过or_two_filters将各输入数组的空值位图做或运算得到整列的空值掩码并返回。类型推断与使用限制多态类型推断由于每个输入数组的类型可以不同FE 在分析阶段通过ArraysZipDeduce推断器见 PolymorphicFunctionAnalyzer.java根据实参的数组元素类型推导出结果 STRUCT 各字段的具体类型无需用户显式声明。至少一个参数BE 侧强制校验参数个数 ≥ 1空参数调用将直接报错。长度上限结果数组长度等于最长输入数组长度处理超长数组时需关注单行内存占用对大规模数据建议先对数组列做长度裁剪如配合array_slice再 zip。NULL 语义注意数组元素本身为 NULL 与长度不足补齐 NULL在结果中不可区分均呈现为字段值null业务上如需区分需自行用哨兵值标记。相关函数arrays_zip常用于数组对齐与分析场景可与以下数组函数配合使用完整列表见 array-functions 目录array_length获取数组长度用于 zip 前校验长度关系unnest将数组展开为多行与arrays_zip合并后的 STRUCT 数组配合可实现列对齐展开array_map对数组逐元素做变换zip 后可对 STRUCT 字段进一步加工element_at按下标访问数组元素可用于访问 zip 结果中的指定位置。小结arrays_zip以按索引拉链合并这一朴素而强大的语义为多数组列对齐提供了标准解法长度不齐自动补 NULL、任意类型可混合、字段自动命名colN、空数组与 NULL 数组均有明确结果。结合 BE 端 array_functions.cpp 的向量化实现与 FE 端多态推断机制可以确信其在批量行处理下仍保持列式执行的高效性。在需要将多个并列数组列组装为结构化记录时arrays_zip是最直接、最贴合列式存储设计的函数选择。【免费下载链接】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),仅供参考