本文将为您介绍实时计算Flink版支持的BITMAP位图类型及相关函数的使用方法。
使用限制
仅实时计算Flink版VVR 11.5及以上版本支持BITMAP位图类型及相关函数。
BITMAP位图类型
BITMAP是一种存储32位无符号整数集合的位图数据类型,基于RoaringBitmap标准实现了自适应的压缩格式,适合用于大规模数据的高效存储、精确去重计数和集合代数运算。
凭借标准化的序列化格式,位图数据能够与外部系统实现二进制级别的无缝互通。
使用建议
使用BITMAP聚合函数时,强烈建议开启MiniBatch或在窗口聚合中使用,可以优化状态访问开销、显著提升性能。
BITMAP聚合函数在处理Append-Only输入时性能最佳,但在处理Retraction输入时性能明显下降,建议尽量避免对BITMAP进行多级GroupBy聚合。
BITMAP目前仅支持存储INT类型(32位整数),如需存储其他类型:
BIGINT类型(64位整数):根据实际数据特征建立字典映射到INT类型,或分桶存储。
非整型:建立字典映射到INT类型。
BITMAP类型对于连续稠密数据的压缩效果显著优于离散稀疏数据,可以通过数据映射提高BITMAP压缩效率。
函数列表
BITMAP目前支持的函数主要包括位图构造、逻辑运算、统计信息和格式转换四个类别。
聚合函数
SQL | Table API | 输入类型 | 输出类型 | 描述 |
BITMAP_BUILD_AGG(value) | value.bitmapBuildAgg() | INT | BITMAP | 将 32 位整数聚合成位图。 |
BITMAP_AND_AGG(bitmap) | bitmap.bitmapAndAgg() | BITMAP | BITMAP | 聚合多个位图的交集(AND)。 |
BITMAP_OR_AGG(bitmap) | bitmap.bitmapOrAgg() | BITMAP | BITMAP | 聚合多个位图的并集(OR)。 |
BITMAP_XOR_AGG(bitmap) | bitmap.bitmapXorAgg() | BITMAP | BITMAP | 聚合多个位图的异或(XOR)。 |
BITMAP_BUILD_CARDINALITY_AGG(value) | value.bitmapBuildCardinalityAgg() | INT | BIGINT | 将 32 位整数聚合成位图并返回其 64 位基数。 |
BITMAP_AND_CARDINALITY_AGG(bitmap) | bitmap.bitmapAndCardinalityAgg() | BITMAP | BIGINT | 聚合多个位图的交集(AND)并返回其 64 位基数。 |
BITMAP_OR_CARDINALITY_AGG(bitmap) | bitmap.bitmapOrCardinalityAgg() | BITMAP | BIGINT | 聚合多个位图的并集(OR)并返回其 64 位基数。 |
BITMAP_XOR_CARDINALITY_AGG(bitmap) | bitmap.bitmapXorCardinalityAgg() | BITMAP | BIGINT | 聚合多个位图的异或(XOR)并返回其 64 位基数。 |
基数统计场景中,若不需要具体位图,建议使用BITMAP_XX_CARDINALITY_AGG()替代BITMAP_CARDINALITY(BITMAP_XX_AGG())的写法,两者功能一致,但前者性能更优。
标量函数
SQL | Table API | 输入类型 | 输出类型 | 描述 |
BITMAP_BUILD(array) | array.bitmapBuild() | ARRAY<INT> | BITMAP | 从 32 位整数数组创建位图。 如果参数为NULL,则返回NULL。 |
BITMAP_CARDINALITY(bitmap) | bitmap.bitmapCardinality() | BITMAP | BIGINT | 返回位图的 64 位基数。 如果参数为NULL,则返回NULL。 |
BITMAP_AND(bitmap1, bitmap2) | bitmap1.bitmapAnd(bitmap2) | BITMAP, BITMAP | BITMAP | 计算两个位图的交集 (AND)。 如果任一参数为NULL,则返回NULL。 |
BITMAP_OR(bitmap1, bitmap2) | bitmap1.bitmapOr(bitmap2) | BITMAP, BITMAP | BITMAP | 计算两个位图的并集(OR)。 如果任一参数为NULL,则返回NULL。 |
BITMAP_XOR(bitmap1, bitmap2) | bitmap1.bitmapXor(bitmap2) | BITMAP, BITMAP | BITMAP | 计算两个位图的异或(XOR)。 如果任一参数为NULL,则返回NULL。 |
BITMAP_ANDNOT(bitmap1, bitmap2) | bitmap1.bitmapAndnot(bitmap2) | BITMAP, BITMAP | BITMAP | 计算两个位图的差集(AND NOT)。 如果任一参数为NULL,则返回NULL。 |
BITMAP_FROM_BYTES(bytes) | bytes.bitmapFromBytes() | BYTES | BITMAP | 将字节数组转换为位图。遵循32-bit RoaringBitmap format specification定义的格式。 如果参数为NULL,则返回NULL。 |
BITMAP_TO_BYTES(bitmap) | bitmap.bitmapToBytes() | BITMAP | BYTES | 将位图转换为字节数组。遵循32-bit RoaringBitmap format specification定义的格式。 如果参数为NULL,则返回NULL。 |
BITMAP_TO_ARRAY(bitmap) | bitmap.bitmapToArray() | BITMAP | ARRAY<INT> | 将位图转换为 32 位整数数组,值按 如果参数为NULL,则返回NULL。 |
BITMAP_TO_STRING(bitmap) | bitmap.bitmapToString() | BITMAP | STRING | 将位图转换为字符串,值按
如果参数为NULL,则返回NULL。 |