このトピックでは、Realtime Compute for Apache Flink でサポートされている BITMAP データ型と関連関数について説明します。
制限事項
Realtime Compute for Apache Flink の Ververica Runtime (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 関数は、ビットマップ構築、論理演算、統計情報、フォーマット変換の 4 つの主要なカテゴリに分類されます。
集計関数
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_CARDINALITY(BITMAP_XX_AGG()) の代わりに BITMAP_XX_CARDINALITY_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 | 2 つのビットマップの積集合 (AND) を計算します。 いずれかのパラメーターが NULL の場合、この関数は NULL を返します。 |
BITMAP_OR(bitmap1, bitmap2) | bitmap1.bitmapOr(bitmap2) | BITMAP, BITMAP | BITMAP | 2 つのビットマップの和集合 (OR) を計算します。 いずれかのパラメーターが NULL の場合、この関数は NULL を返します。 |
BITMAP_XOR(bitmap1, bitmap2) | bitmap1.bitmapXor(bitmap2) | BITMAP, BITMAP | BITMAP | 2 つのビットマップの排他的論理和 (XOR) を計算します。 いずれかのパラメーターが NULL の場合、この関数は NULL を返します。 |
BITMAP_ANDNOT(bitmap1, bitmap2) | bitmap1.bitmapAndnot(bitmap2) | BITMAP, BITMAP | BITMAP | 2 つのビットマップの差集合 (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 を返します。 |