ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

StarRocks bitmap_contains 函数详解:语法、示例与底层实现原理

StarRocks bitmap_contains 函数详解:语法、示例与底层实现原理 StarRocks bitmap_contains 函数详解语法、示例与底层实现原理【免费下载链接】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本文围绕 StarRocks 内置的bitmap_contains函数展开完整讲解其语法定义、参数类型、返回值语义与实战用法并结合当前仓库中 BEBackend与 FEFrontend的源码实现剖析该函数在向量化执行引擎中的实际调用链与BitmapValue的底层存储判定逻辑。读完本文你将掌握如何使用bitmap_contains判断某个整数值是否命中 Bitmap 集合并能据此写出可直接运行、可进一步性能调优的查询。函数概述bitmap_contains用于计算输入值是否包含在 Bitmap 中并返回一个布尔值Boolean。它是 StarRocks Bitmap 函数族中最基础的成员判断函数常被用于 UV去重用户分析场景中的集合归属判断例如某个用户 ID 是否属于某天的活跃用户集合。该函数在 FE 端被统一注册在 FunctionSet.java 中与bitmap_and、bitmap_count、bitmap_has_any、to_bitmap等同属于 Bitmap 函数族可在 SQL 中直接调用无需额外安装或配置。语法说明BOOLEAN BITMAP_CONTAINS(BITMAP bitmap, BIGINT input)参数含义如下参数类型说明bitmapBITMAP待查找的 Bitmap 值。可以是 Bitmap 类型的列也可以是通过to_bitmap、bitmap_from_string等函数构造出的 Bitmap 表达式inputBIGINT需要在 Bitmap 中查找的目标整数值返回值类型为BOOLEAN当input命中bitmap中已包含的元素时返回true即1否则返回false即0。值得注意的是bitmap_contains的第二个参数被定义为BIGINT。从 bitmap_functions.cpp 的向量化求值签名VectorizedStrictBinaryFunctionTYPE_OBJECT, TYPE_BIGINT, TYPE_BOOLEAN可以看出它接收的第一个参数是BITMAP对象TYPE_OBJECT第二个参数按BIGINT处理返回值按BOOLEAN输出。使用示例基础示例以下示例直接使用to_bitmap构造包含元素1的 Bitmap再用bitmap_contains判断2与1是否在其中MySQL select bitmap_contains(to_bitmap(1),2) cnt; ------ | cnt | ------ | 0 | ------ MySQL select bitmap_contains(to_bitmap(1),1) cnt; ------ | cnt | ------ | 1 | ------第一个查询中Bitmap 仅包含1查找2返回0第二个查询查找1返回1验证了函数的包含即命中语义。在 WHERE 谓词中使用由于bitmap_contains返回布尔值它可以直接作为过滤谓词参与行裁剪例如SELECT user_id FROM user_bitmap_table WHERE bitmap_contains(active_users, 10086);从 FE 端优化器测试 ExpressionTest.java 可以看到bitmap_contains会被优化器正确保留在predicates中并自动对第二参数字段做CAST(... AS BIGINT)类型对齐例如计划中出现(bitmap_contains(5: b1, CAST(1: v1 AS BIGINT)))形式的谓词表达式。这保证了即使传入的是其他整数类型字段也能正确参与谓词求值。结合其他 Bitmap 函数构造复杂集合bitmap_contains的第一个参数不仅可以是列也可以是任意返回BITMAP的表达式。例如用bitmap_from_string直接构造一个包含多个元素的集合后进行判断SELECT bitmap_contains(bitmap_from_string(1,3,5,7), 3); -- 返回 1 SELECT bitmap_contains(bitmap_from_string(1,3,5,7), 4); -- 返回 0这种写法在临时集合校验、ETL 数据自检等场景中非常实用无需建表即可快速验证集合成员关系。源码实现解析BE 端向量化实现在 BE 端bitmap_contains的实现位于 bitmap_functions.cpp完整实现如下// bitmap_contains DEFINE_BINARY_FUNCTION_WITH_IMPL(bitmapContainsImpl, bitmap_ptr, int_value) { return bitmap_ptr-contains(int_value); } StatusOrColumnPtr BitmapFunctions::bitmap_contains(FunctionContext* context, const starrocks::Columns columns) { return VectorizedStrictBinaryFunctionbitmapContainsImpl::evaluateTYPE_OBJECT, TYPE_BIGINT, TYPE_BOOLEAN( columns[0], columns[1]); }其核心逻辑非常简洁通过DEFINE_BINARY_FUNCTION_WITH_IMPL宏定义二元函数实现直接调用BitmapValue::contains(int_value)完成成员判定随后由VectorizedStrictBinaryFunction以向量化方式批量求值一次处理整列数据这正是 StarRocks 向量化执行引擎下该函数性能优异的关键。函数声明则通过 bitmap_functions.h 中的DEFINE_VECTORIZED_FN(bitmap_contains)完成注册确保其以向量化函数形式被执行器调用。BitmapValue 的底层存储与判定逻辑bitmap_contains真正依赖的成员判定能力由BitmapValue提供。在 bitmap_value.cpp 中可以看到contains方法会根据 Bitmap 当前的内部存储形态分派处理// check if value x is present bool BitmapValue::contains(uint64_t x) const { switch (_type) { case EMPTY: return false; case SINGLE: return _sv x; case BITMAP: return _bitmap-contains(x); case SET: return _set-contains(x); } return false; }StarRocks 的BitmapValue会根据数据规模动态选择最紧凑的存储形态EMPTY、SINGLE单值、SET稀疏集合、BITMAP密集位图而contains针对每种形态都做了对应的最优判定空集合直接返回false单值集合做一次相等比较位图形态走位图查询稀疏集合走哈希集合查询。这意味着无论 Bitmap 的稠密程度如何bitmap_contains都能以接近常数的时间复杂度完成单值成员判断。测试与验证仓库中为bitmap_contains提供了完整的单元测试可从多个维度验证其正确性。在 BE 端测试 bitmap_functions_test.cpp 中bitmapContainsTest构造了包含元素1、2、3、4的 Bitmapb1和包含元素4、5、6、7的 Bitmapb2随后按行配对调用bitmap_contains对(b1, 4)判定结果为1命中对(b2, 1)判定结果为0未命中。测试断言输出列类型为数值型is_numeric且结果与预期一致验证了函数在向量化逐行求值路径上的正确性。FE 端同样有对应的执行计划测试与物化视图改写测试ExpressionTest.java 验证了bitmap_contains在布尔谓词化简场景中会被正确保留并参与谓词下推MVRewriteTest.java 展示了bitmap_contains(to_bitmap(1), 2)这类表达式可出现在查询中并被优化器正常处理。这些测试共同保证了该函数从 SQL 解析、查询优化到向量化执行全链路的可靠性。使用场景与注意事项典型场景bitmap_contains最常见的用法是与聚合模型中的 BITMAP 列配合做集合成员关系过滤例如判断某个用户是否在某段时间的活跃用户集合中、某个商品是否在某用户的已购集合中等。注意事项参数类型匹配第二参数按BIGINT处理如果传入其他整数类型优化器会自动插入CAST进行类型对齐见前文 ExpressionTest 验证无需手动转换。与聚合函数的配合在做大规模 UV 计算时通常先用bitmap_union或bitmap_union_count聚合出集合再结合bitmap_contains做精细的成员判断直接对未聚合的明细列逐行判断虽然可用但应结合具体数据规模评估性能。语义对比若需要判断两个 Bitmap 是否存在交集应使用bitmap_has_anybitmap_contains只负责单个值是否属于某个集合这一更基础的语义。相关函数参考bitmap_contains常与以下 Bitmap 函数配合使用可进一步阅读对应文档深入掌握to_bitmap 系列构造函数将整数值转换为 Bitmap如to_bitmap、bitmap_from_string 的同族函数bitmap_count统计 Bitmap 中元素的基数与bitmap_contains配合可先判断是否命中、再统计集合规模base64_to_bitmap在导入场景中将 Base64 编码的 Bitmap 数据还原为 Bitmap 值是bitmap_contains数据来源的典型前置步骤bitmap_and、bitmap_andnot集合运算类函数用于多集合间的交、差计算。从函数注册FunctionSet.java、向量化执行bitmap_functions.cpp到底层存储判定bitmap_value.cppbitmap_contains是一条从 SQL 到存储内核都经过精心设计的完整链路理解它有助于你在实际业务中更自信地使用 Bitmap 类型做高性能集合分析。【免费下载链接】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),仅供参考
返回列表