函数接收一行记录或者一个BitMap64
对象,返回一行结果。
这部分的函数接口,除第一个函数arrayToBitmap
外,其它的均和社区函数接口保持一致,示例可以参考上一小节【Bit & Bitmap 函数】。
序号 | 函数接口 | 参数说明 | 返回值 | 功能释义 |
---|---|---|---|---|
1 | arrayToBitmap([x1, …]) | UIntN类型的数组 | BitMap64对象 | 通过一个数组构造一个bitmap对象 |
2 | bitmapToArray(bitmap) | 一个BitMap64对象 | UInt64数组 | 将一个bimap对象转换为数组格式 |
3 | bitmapAnd(bitmap1, bitmap2) | 两个BitMap64对象 | BitMap64对象 | bitmap的交运算 |
4 | bitmapOr(bitmap1, bitmap2) | 两个BitMap64对象 | BitMap64对象 | bitmap的并运算 |
5 | bitmapXor(bitmap1, bitmap2) | 两个BitMap64对象 | BitMap64对象 | bitmap的异或运算 |
6 | bitmapAndnot(bitmap1, bitmap2) | 两个BitMap64对象 | BitMap64对象 | bitmap的差运算 |
7 | bitmapCardinality(bitmap) | 一个BitMap64对象 | UInt64数值 | bitmap中元素的个数 |
8 | bitmapMin(bitmap) | 一个BitMap64对象 | UInt64数值 | bitmap中最小的元素 |
9 | bitmapMax(bitmap) | 一个BitMap64对象 | UInt64数值 | bitmap中最大的元素 |
10 | bitmapAndCardinality | 两个BitMap64对象 | UInt64数值 | bitmap的交运算之后的元素个数 |
11 | bitmapOrCardinality | 两个BitMap64对象 | UInt64数值 | bitmap的并运算之后的元素个数 |
12 | bitmapXorCardinality | 两个BitMap64对象 | UInt64数值 | bitmap的异或运算之后的元素个数 |
13 | bitmapAndnotCardinality | 两个BitMap64对象 | UInt64数值 | bitmap的差运算之后的元素个数 |
14 | bitmapContains(bitmap, integer) | 一个BitMap64对象 | UInt8枚举 | 检查bitmap中是否包含指定元素 |
15 | bitmapHasAll | 两个BitMap64对象 | UInt8枚举 | 检查sub_bitmap是否是bitmap的子集 |
16 | bitmapHasAny | 两个BitMap64对象 | UInt8枚举 | 检查两个bitmap是否存在交集 |
17 | bitmapSubsetInRange | 一个BitMap64对象,两个UIntN数字,标识取值范围 | BitMap64对象 | 检查并返回bitmap中符合给定元素大小范围的值组成的bitmap。 |
18 | bitmapSubsetLimit | 一个BitMap64对象,两个UIntN数字,标识下标启示范围,和子集大小 | BitMap64对象 | 检查并返回由bitmap中指定元素开始的,不超过指定数量的元素组成的bitmap。 |
19 | subBitmap(bitmap, start_offset, length) | 一个BitMap64对象, | BitMap64对象 | 提取bitmap中指定下标范围的数据,类比subString。 |
下述聚合函数接收多行记录,进行聚合操作,返回一行结果。
序号 | 函数接口 | 参数说明 | 返回值 | 功能释义 |
---|---|---|---|---|
1 | bitmapColumnAnd | BitMap64类型的一列数据 | BitMap64对象 | 接收一个bimap列,该列所有bitmap做交运算 |
2 | bitmapColumnOr | BitMap64类型的一列数据 | BitMap64对象 | 接收一个bimap列,该列所有bitmap做并运算 |
3 | bitmapColumnXor | BitMap64类型的一列数据 | BitMap64对象 | 接收一个bimap列,该列所有bitmap做异或运算 |
4 | bitmapColumnCardinality | BitMap64类型的一列数据 | UInt64数值 | 接收一个bimap列,该列所有bitmap做并运算,返回最终结果bitmap的元素个数 |
5 | bitmapColumnHas | BitMap64类型的一列数据 | UInt8枚举 | 接收一个bimap列,检查该列是否包含指定元素 |
6 | bitmapFromColumn(id) -> bitmap | 整数列 | BitMap64对象 | 接收一列整数,聚合成一个bitmap |
以下是具体的函数示例:
计算一列 bitmap 的交集。
语法
bitmapColumnAnd(bitmap_column)
参数bitmap_column
- BitMap64 类型的数据列。
返回值
示例
select bitmapColumnAnd(rbm) as result from ( select arrayToBitmap([1,2,3]) as rbm union all select arrayToBitmap([2,3,4]) as rbm )
结果:
┌─result─┐ │ {2,3} │ └────────┘
计算一列 bitmap 的并集。
语法
bitmapColumnOr(bitmap_column)
参数bitmap_column
- BitMap64 类型的数据列。
返回值
示例
select bitmapColumnOr(rbm) as result from ( select arrayToBitmap([1,2,3]) as rbm union all select arrayToBitmap([2,3,4]) as rbm )
结果:
┌─result────┐ │ {1,2,3,4} │ └───────────┘
计算一列 bitmap 的异或集。
语法
bitmapColumnXor(bitmap_column)
参数bitmap_column
- BitMap64 类型的数据列。
返回值
示例
select bitmapColumnXor(rbm) as result from ( select arrayToBitmap([1,2,3]) as rbm union all select arrayToBitmap([2,3,4]) as rbm )
结果:
┌─result─┐ │ {1,4} │ └────────┘
计算一列 bitmap 的并集包含的元素个数。
语法
bitmapColumnCardinality(bitmap_column)
参数bitmap_column
- BitMap64 类型的数据列。
返回值
示例
select bitmapColumnCardinality(rbm) as result from ( select arrayToBitmap([1,2,3]) as rbm union all select arrayToBitmap([2,3,4]) as rbm )
结果:
┌─result─┐ │ 4 │ └────────┘
判断一列 bitmap 中是否包含指定数值。
语法
bitmapColumnHas(bitmap_column, integer_number)
参数bitmap_column
- BitMap64 类型的数据列。integer_number
- 一个常量数值。类型为64位以内的正整数。
返回值
bitmapContains
的区别在于改函数对于一列 bitmap仅返回一行值,bitmapContains
则是多行。示例
select bitmapColumnHas(rbm, 3) as result from ( select arrayToBitmap([1,2,3]) as rbm union all select arrayToBitmap([2,3,4]) as rbm )
结果:
┌─result─┐ │ 1 │ └────────┘
从一列数值中构建一个BitMap64 对象。
语法
bitmapFromColumn(integer_column)
参数
integer_column
- 64 位以内的正整数列。返回值
示例
select bitmapFromColumn(number) as res from numbers(10);
结果:
┌─res───────────────────┐ │ {0,1,2,3,4,5,6,7,8,9} │ └───────────────────────┘
这种函数有两个括号传递参数:
ByteHouse 提供了一系列聚合函数用于批量处理大量 bitmap 之间的复杂计算。通过给每个待计算的 bitmap编序号,并用序号书写表达出集合的交并差运算,ByteHouse 可以根据指定的运算表达式完成对应的 bitmap 运算,直接把计算可视化和简便化,极大提升了写 SQL的体验!
简单图示如下:
序号 | 函数接口 | 参数说明 | 返回值 | 功能释义 |
---|---|---|---|---|
1 | bitmapCount | expression是与或差表达式, | UInt64数值 | 对于bitmap列中的每一行,取其标记idx,存入 map 中。最终依据expression指定的计算方式进行bitmap运算,返回最终bitmap中元素个数 |
2 | bitmapExtract | expression是与或差表达式, | BitMap64对象 | 对于bitmap列中的每一行,取其idx,并依据expression指定的计算方式进行bitmap运算,返回最终计算结果的bitmap |
3 | bitmapMultiCount | expression是与或差表达式, | UInt64数组 | 对于bitmap列中的每一行,取其编号 idx,并依据每个expr指定的计算方式进行多组bitmap运算,返回每组expr计算的结果bitmap中元素个数 |
4 | bitmapMultiExtract | expression是与或差表达式, | BitMap64数组 | 对于bitmap列中的每一行,取其编号 idx,并依据每个expr指定的计算方式进行多组bitmap运算,返回每组expr计算的结果的bitmap数据 |
5 | bitmapMultiCountWithDate | expression是与或差表达式, | UInt64数组 | 在bitmapMultiCount的基础上增加了日期维度,可以区别出不同日期中的编号。即 bitmapMultiCount 只支持一个编号维度,该函数则额外增加了日期维度。 |
6 | bitmapMultiExtractWithDate | expression是与或差表达式, | BitMap64数组 | 在bitmapMultiExtract的基础上增加了日期维度,可以区别出不同日期中的标签。即 bitmapMultiExtract 只支持一个编号维度,该函数则额外增加了日期维度。 |
Tips: 如果存在相同编号idx的多行数据,聚合函数会自动把多行bitmap通过OR运算合并为一个,参与计算。最终计算时,一个idx对应一个bitmap。
以下是具体的函数说明
依据用户指定的计算表达式,执行相应的bitmap运算,返回最终bitmap中元素个数。
语法:
BitMapCount(expr)(idx_column, bitmap_column)
参数
expr
- 使用数字或字符串表示的与(&
)、或(|
)、差(~
)运算,&
表示bitmap交集,|
表示bitmap并集,~
表示bitmap差集,该函数仅支持一个表达式。idx_column
- 用于标记 bitmap的数据列,可以是整数列(通常为 Int16/32/64类型),或者字符串列。bitmap_column
- BitMap64 数据列。注1:不要求idx_column
数据和bitmap_column
数据一一对应,如果idx_column
存在重复数据,则值相同的多行 bitmap 会先进行并集运算,合并为一个唯一的 bitmap 参与计算。
注 2:当idx_column
列类型位字符串时,不能包含如下保留字符:&
, |
, ~
, ,
, #
, (
, )
, _
和英文空格。
返回值
示例
SELECT bitmapCount('a')(tag_value, uids) AS res FROM ( SELECT 'a' AS tag_value, arrayToBitmap([1, 2, 3]) AS uids )
结果:
┌─res─┐ │ 3 │ └─────┘
SELECT BitmapCount('((a&b)|c) ~ d')(tag_value, uids) AS res1, BitmapCount('((1&2)|3)~4')(multiIf(tag_value = 'a', toInt16(1), tag_value = 'b', toInt16(2), tag_value = 'c', toInt16(3), tag_value = 'd', toInt16(4), toInt16(0)) AS idx, uids) AS res2 FROM ( SELECT 'a' AS tag_value, arrayToBitmap([1, 2, 3, 4, 5]) AS uids UNION ALL SELECT 'b' AS tag_value, arrayToBitmap([3, 4, 5, 6]) AS uids UNION ALL SELECT 'c' AS tag_value, arrayToBitmap([5, 7]) AS uids UNION ALL SELECT 'd' AS tag_value, arrayToBitmap([7]) AS uids )
结果
┌─res1─┬─res2─┐ │ 3 │ 3 │ └──────┴──────┘
依据用户指定的计算表达式,执行相应的bitmap运算,返回最终bitmap。
语法:
BitMapExtract(expr)(idx_column, bitmap_column)
参数
expr
- 使用数字或字符串表示的与(&
)、或(|
)、差(~
)运算,&
表示bitmap交集,|
表示bitmap并集,~
表示bitmap差集,该函数仅支持一个表达式。idx_column
- 用于标记 bitmap的数据列,可以是整数列(通常为 Int16/32/64类型),或者字符串列。bitmap_column
- BitMap64 数据列。注1:不要求idx_column
数据和bitmap_column
数据一一对应,如果idx_column
存在重复数据,则值相同的多行 bitmap 会先进行并集运算,合并为一个唯一的 bitmap 参与计算。
注 2:当idx_column
列类型位字符串时,不能包含如下保留字符:&
, |
, ~
, ,
, #
, (
, )
, _
和英文空格。
返回值
示例
SELECT bitmapExtract('a')(tag_value, uids) AS res FROM ( SELECT 'a' AS tag_value, arrayToBitmap([1, 2, 3]) AS uids )
结果
┌─res─────┐ │ {1,2,3} │ └─────────┘
SELECT BitmapExtract('((a&b)|c) ~ d')(tag_value, uids) AS res1, BitmapExtract('((1&2)|3)~4')(multiIf(tag_value = 'a', toInt16(1), tag_value = 'b', toInt16(2), tag_value = 'c', toInt16(3), tag_value = 'd', toInt16(4), toInt16(0)) AS idx, uids) AS res2 FROM ( SELECT 'a' AS tag_value, arrayToBitmap([1, 2, 3, 4, 5]) AS uids UNION ALL SELECT 'b' AS tag_value, arrayToBitmap([3, 4, 5, 6]) AS uids UNION ALL SELECT 'c' AS tag_value, arrayToBitmap([5, 7]) AS uids UNION ALL SELECT 'd' AS tag_value, arrayToBitmap([7]) AS uids )
结果:
┌─res1────┬─res2────┐ │ {3,4,5} │ {3,4,5} │ └─────────┴─────────┘
依据用户指定的一组计算表达式,每组执行相应的bitmap运算,返回每组最终bitmap中元素个数。
语法:
BitmapMultiCount(expr1, expr2, expr3,...)(idx_column, bitmap_column)
参数
expr
- 使用数字或字符串表示的与(&
)、或(|
)、差(~
)运算,&
表示bitmap交集,|
表示bitmap并集,~
表示bitmap差集,该函数支持多个表达式。idx_column
- 用于标记 bitmap的数据列,可以是整数列(通常为 Int16/32/64类型),或者字符串列。bitmap_column
- BitMap64 数据列。注1:不要求idx_column
数据和bitmap_column
数据一一对应,如果idx_column
存在重复数据,则值相同的多行 bitmap 会先进行并集运算,合并为一个唯一的 bitmap 参与计算。
注2:当idx_column
列类型位字符串时,不能包含如下保留字符:&
, |
, ~
, ,
, #
, (
, )
, _
和英文空格。
注3:支持结果复用。比如 expr1='a&b'
, expr2='(a&b)|c
。那么可以简化 expr2 的写法为expr2='_1|c'
。使用下划线+数字可以指定某个已经出现过的表达式,可以简化复杂表达式写法。
返回值
示例
SELECT BitmapMultiCount('a')(tag_value, uids) AS res FROM ( SELECT 'a' AS tag_value, arrayToBitmap([1, 2, 3]) AS uids )
┌─res─┐ │ [3] │ └─────┘
SELECT BitmapMultiCount('1&2', '(1&2)|3', '_1|3', '((1&2)|3) ~ 4', '_2~4')(tag_value, uids) AS res FROM ( SELECT toInt32(1) AS tag_value, arrayToBitmap([1, 2, 3, 4, 5]) AS uids UNION ALL SELECT toInt32(2) AS tag_value, arrayToBitmap([3, 4, 5, 6]) AS uids UNION ALL SELECT toInt32(3) AS tag_value, arrayToBitmap([5, 7]) AS uids UNION ALL SELECT toInt32(4) AS tag_value, arrayToBitmap([7]) AS uids )
结果:
┌─res─────────┐ │ [3,4,4,3,3] │ └─────────────┘
依据用户指定的一组计算表达式,每组执行相应的bitmap运算,返回每组最终bitmap。
语法:
BitmapMultiExtract(expr1, expr2, expr3,...)(idx_column, bitmap_column)
参数
expr
- 使用数字或字符串表示的与(&
)、或(|
)、差(~
)运算,&
表示bitmap交集,|
表示bitmap并集,~
表示bitmap差集,该函数支持多个表达式。idx_column
- 用于标记 bitmap的数据列,可以是整数列(通常为 Int16/32/64类型),或者字符串列。bitmap_column
- BitMap64 数据列。注1:不要求idx_column
数据和bitmap_column
数据一一对应,如果idx_column
存在重复数据,则值相同的多行 bitmap 会先进行并集运算,合并为一个唯一的 bitmap 参与计算。
注2:当idx_column
列类型位字符串时,不能包含如下保留字符:&
, |
, ~
, ,
, #
, (
, )
, _
和英文空格。
注3:支持结果复用。比如 expr1='a&b'
, expr2='(a&b)|c
。那么可以简化 expr2 的写法为expr2='_1|c'
。使用下划线+数字可以指定某个已经出现过的表达式,可以简化复杂表达式写法。
返回值
示例
SELECT BitmapMultiExtract('a')(tag_value, uids) AS res FROM ( SELECT 'a' AS tag_value, arrayToBitmap([1, 2, 3]) AS uids )
┌─res───────┐ │ [{1,2,3}] │ └───────────┘
SELECT BitmapMultiExtract('1&2', '(1&2)|3', '_1|3', '((1&2)|3) ~ 4', '_2~4')(tag_value, uids) AS res FROM ( SELECT toInt32(1) AS tag_value, arrayToBitmap([1, 2, 3, 4, 5]) AS uids UNION ALL SELECT toInt32(2) AS tag_value, arrayToBitmap([3, 4, 5, 6]) AS uids UNION ALL SELECT toInt32(3) AS tag_value, arrayToBitmap([5, 7]) AS uids UNION ALL SELECT toInt32(4) AS tag_value, arrayToBitmap([7]) AS uids )
结果:
┌─res───────────────────────────────────────────┐ │ [{3,4,5},{3,4,5,7},{3,4,5,7},{3,4,5},{3,4,5}] │ └───────────────────────────────────────────────┘
依据用户指定的一组计算表达式,每组执行相应的bitmap运算,返回每组最终bitmap中元素个数。相比函数BitmapMultiCount
多了一个日期表示维度。
语法:
BitmapMultiCountWithDate(expr1, expr2, expr3,...)(date_column, idx_column, bitmap_column)
参数
expr
- 使用数字或字符串表示的与(&
)、或(|
)、差(~
)运算,&
表示bitmap交集,|
表示bitmap并集,~
表示bitmap差集,该函数支持多个表达式,需要注意每个表达式由两部分组成:一部分是日期,一部分是标记,并使用下划线连接,示例为20240101_aaa&20240102_aaa
。date_colulmn
- 用于指定数据日期,需要时 Int64 类型表示的日期列,格式为 YYYYMMDD。idx_column
- 用于标记 bitmap的数据列,可以是整数列(通常为 Int16/32/64类型),或者字符串列。bitmap_column
- BitMap64 数据列。注1:不要求date_column+idx_column
数据和bitmap_column
数据一一对应,如果date_column+idx_column
存在重复数据,则值相同的多行 bitmap 会先进行并集运算,合并为一个唯一的 bitmap 参与计算。
注2:当idx_column
列类型位字符串时,不能包含如下保留字符:&
, |
, ~
, ,
, #
, (
, )
, _
和英文空格。
注3:支持结果复用。比如 expr1='a&b'
, expr2='(a&b)|c
。那么可以简化 expr2 的写法为expr2='_1|c'
。使用下划线+数字可以指定某个已经出现过的表达式,可以简化复杂表达式写法。
返回值
示例
SELECT BitmapMultiCountWithDate('20240102_a~20240101_a', '20240101_a&20240102_a')(toInt64(toYYYYMMDD(date)), tag_value, uids) AS res FROM ( SELECT 'a' AS tag_value, '2024-01-01' AS date, arrayToBitmap([1, 2, 3]) AS uids UNION ALL SELECT 'a' AS tag_value, '2024-01-02' AS date, arrayToBitmap([2, 3, 4, 5, 6]) AS uids )
┌─res───┐ │ [3,2] │ └───────┘
SELECT BitmapMultiCountWithDate('20240101_1 & 20240102_2', '_1 | 20240101_3', '_2 ~ 20240101_4')(toInt64(toYYYYMMDD(date)), tag_value, uids) AS res FROM ( SELECT toInt32(1) AS tag_value, '2024-01-01' AS date, arrayToBitmap([1, 2, 3, 4, 5]) AS uids UNION ALL SELECT toInt32(2) AS tag_value, '2024-01-02' AS date, arrayToBitmap([3, 4, 5, 6]) AS uids UNION ALL SELECT toInt32(3) AS tag_value, '2024-01-01' AS date, arrayToBitmap([5, 7]) AS uids UNION ALL SELECT toInt32(4) AS tag_value, '2024-01-01' AS date, arrayToBitmap([7]) AS uids )
结果:
┌─res─────┐ │ [3,4,3] │ └─────────┘
依据用户指定的一组计算表达式,每组执行相应的bitmap运算,返回每组最终bitmap。相比函数BitmapMultiExtract
多了一个日期表示维度。
语法:
BitmapMultiExtractWithDate(expr1, expr2, expr3,...)(date_column, idx_column, bitmap_column)
参数
expr
- 使用数字或字符串表示的与(&
)、或(|
)、差(~
)运算,&
表示bitmap交集,|
表示bitmap并集,~
表示bitmap差集,该函数支持多个表达式,需要注意每个表达式由两部分组成:一部分是日期,一部分是标记,并使用下划线连接,示例为20240101_aaa&20240102_aaa
。date_colulmn
- 用于指定数据日期,需要时 Int64 类型表示的日期列,格式为 YYYYMMDD。idx_column
- 用于标记 bitmap的数据列,可以是整数列(通常为 Int16/32/64类型),或者字符串列。bitmap_column
- BitMap64 数据列。注1:不要求date_column+idx_column
数据和bitmap_column
数据一一对应,如果date_column+idx_column
存在重复数据,则值相同的多行 bitmap 会先进行并集运算,合并为一个唯一的 bitmap 参与计算。
注2:当idx_column
列类型位字符串时,不能包含如下保留字符:&
, |
, ~
, ,
, #
, (
, )
, _
和英文空格。
注3:支持结果复用。比如 expr1='a&b'
, expr2='(a&b)|c
。那么可以简化 expr2 的写法为expr2='_1|c'
。使用下划线+数字可以指定某个已经出现过的表达式,可以简化复杂表达式写法。
返回值
示例
SELECT BitmapMultiExtractWithDate('20240102_a~20240101_a', '20240101_a&20240102_a')(toInt64(toYYYYMMDD(date)), tag_value, uids) AS res FROM ( SELECT 'a' AS tag_value, '2024-01-01' AS date, arrayToBitmap([1, 2, 3]) AS uids UNION ALL SELECT 'a' AS tag_value, '2024-01-02' AS date, arrayToBitmap([2, 3, 4, 5, 6]) AS uids )
┌─res─────────────┐ │ [{4,5,6},{2,3}] │ └─────────────────┘
SELECT BitmapMultiExtractWithDate('20240101_1 & 20240102_2', '_1 | 20240101_3', '_2 ~ 20240101_4')(toInt64(toYYYYMMDD(date)), tag_value, uids) AS res FROM ( SELECT toInt32(1) AS tag_value, '2024-01-01' AS date, arrayToBitmap([1, 2, 3, 4, 5]) AS uids UNION ALL SELECT toInt32(2) AS tag_value, '2024-01-02' AS date, arrayToBitmap([3, 4, 5, 6]) AS uids UNION ALL SELECT toInt32(3) AS tag_value, '2024-01-01' AS date, arrayToBitmap([5, 7]) AS uids UNION ALL SELECT toInt32(4) AS tag_value, '2024-01-01' AS date, arrayToBitmap([7]) AS uids )
结果:
┌─res─────────────────────────┐ │ [{3,4,5},{3,4,5,7},{3,4,5}] │ └─────────────────────────────┘
No. | Function interface | Parameter description | Return value | Brief explanation |
---|---|---|---|---|
1 | EncodeNonBitEngineColumn(UInt64_column, database, table, dictionary,add_new_key_to_bitengine_dict) | UInt64_column: | UInt64 value | 用普通的UInt64作为 BitEngine K-V dictionary中的K,以获取该值经过字典编码之后的值 |
2 | DecodeNonBitEngineColumn(UInt64_column, database, table, dictionary) | UInt64_column: | UInt64 value | 用普通的UInt64作为 BitEngine K-V dictionary中的V,以获取该值在字典编码之前的值 |
3 | EncodeBitmap(bitmap, database, table, dictionary, add_new_key_to_bitengine_dict) | bitmap: source input; | BitMap64 object | 使用BitEngine dictionary来对一个bitmap做编码操作 |
4 | DecodeBitmap(bitmap, database, table, dictionary) | bitmap: source input; | BitMap64 object | 使用BitEngine dictionary来对一个bitmap做解码操作 |
5 | arrayToBitmapWithEncode 最后一个参数是新增的可选参数。没有就是默认值0,如果需要则必须带上,且赋值为1 | UIntN类型的数组, | BitMap64对象 | 利用已存在的BitEngine字典给新的bitmap编码,返回编码后的bitmap |
6 | bitmapToArrayWithDecode(bitmap, 'db', 'tbl', 'dict_name') | bitmap: source input; | Array(UInt64) | 解码bitmap,同时将bitmap转为数组 |