BITMAP 位图函数

本文将为您介绍实时计算Flink版支持的BITMAP位图类型及相关函数的使用方法。

使用限制

  • 仅实时计算FlinkVVR 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 位整数数组,值按Integer.compareUnsigned排序。

如果参数为NULL,则返回NULL。

BITMAP_TO_STRING(bitmap)

bitmap.bitmapToString()

BITMAP

STRING

将位图转换为字符串,值按Integer.compareUnsigned排序。如果字符串过长,将被截断并以...结尾。例如:

  • {}{1,2,3,4,5}

  • 负值(转换为无符号):{0,1,4294967294,4294967295}

  • 字符串过长:{1,2,3,...}

如果参数为NULL,则返回NULL。