メインコンテンツまでスキップ
メインコンテンツまでスキップ

ビットマップ関数

ビットマップは二通りの方法で構築できます。最初の方法は、集約関数 groupBitmap を用いて -State で構築する方法、もう一つの方法は、Array オブジェクトからビットマップを構築することです。

bitmapBuild

符号なし整数配列からビットマップを構築します。

構文

bitmapBuild(array)

引数

  • array – 符号なし整数の配列。

SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res);
┌─res─┬─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─────┐
│     │ AggregateFunction(groupBitmap, UInt8)        │
└─────┴──────────────────────────────────────────────┘

bitmapToArray

ビットマップを整数配列に変換します。

構文

bitmapToArray(bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res;

結果:

┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘

bitmapSubsetInRange

値の区間内にビットを持つビットマップのサブセットを返します。

構文

bitmapSubsetInRange(bitmap, range_start, range_end)

引数

SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res;

結果:

┌─res───────────────┐
│ [30,31,32,33,100] │
└───────────────────┘

bitmapSubsetLimit

最小ビット値 range_start を持ち、かつ最大で cardinality_limit 要素のビットマップのサブセットを返します。

構文

bitmapSubsetLimit(bitmap, range_start, cardinality_limit)

引数

SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res;

結果:

┌─res───────────────────────┐
│ [30,31,32,33,100,200,500] │
└───────────────────────────┘

subBitmap

ビットマップのサブセットを返し、位置 offset から始まります。返されるビットマップの最大カーディナリティは cardinality_limit です。

構文

subBitmap(bitmap, offset, cardinality_limit)

引数

SELECT bitmapToArray(subBitmap(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(10), toUInt32(10))) AS res;

結果:

┌─res─────────────────────────────┐
│ [10,11,12,13,14,15,16,17,18,19] │
└─────────────────────────────────┘

bitmapContains

ビットマップが要素を含むかどうかを確認します。

bitmapContains(bitmap, needle)

引数

返される値

  • 0 — bitmapneedle を含まない場合。 UInt8
  • 1 — bitmapneedle を含む場合。 UInt8

SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res;

結果:

┌─res─┐
│  1  │
└─────┘

bitmapHasAny

二つのビットマップが交差するかどうかを確認します。

bitmap2 に正確に一つの要素が含まれる場合、bitmapContains を使用することを検討してください。こちらの方が効率的に動作します。

構文

bitmapHasAny(bitmap1, bitmap2)

引数

  • bitmap1 – ビットマップオブジェクト1。
  • bitmap2 – ビットマップオブジェクト2。

返される値

  • 1、もし bitmap1bitmap2 に少なくとも一つの共有要素がある場合。
  • 0、それ以外の場合。

SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;

結果:

┌─res─┐
│  1  │
└─────┘

bitmapHasAll

最初のビットマップが2番目のビットマップのすべての要素を含む場合は1を返し、それ以外は0を返します。 2番目のビットマップが空である場合は1を返します。

hasAll(array, array) も参照してください。

構文

bitmapHasAll(bitmap1, bitmap2)

引数

  • bitmap1 – ビットマップオブジェクト1。
  • bitmap2 – ビットマップオブジェクト2。

SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;

結果:

┌─res─┐
│  0  │
└─────┘

bitmapCardinality

ビットマップのカーディナリティを返します。

構文

bitmapCardinality(bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res;

結果:

┌─res─┐
│   5 │
└─────┘

bitmapMin

ビットマップ内でセットされている最小ビットを計算し、ビットマップが空であれば UINT32_MAX を返します(タイプが8ビット以上の場合は UINT64_MAX)。

構文

bitmapMin(bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res;

結果:

 ┌─res─┐
 │   1 │
 └─────┘

bitmapMax

ビットマップ内でセットされている最大ビットを計算し、ビットマップが空であれば0を返します。

構文

bitmapMax(bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res;

結果:

 ┌─res─┐
 │   5 │
 └─────┘

bitmapTransform

ビットマップ内の最大 N ビットを置き換えます。i 番目の置き換えられるビットの古い値と新しい値は、それぞれ from_array[i]to_array[i] です。

from_array および to_array の配列順序によって結果が変わることがあります。

構文

bitmapTransform(bitmap, from_array, to_array)

引数

  • bitmap – ビットマップオブジェクト。
  • from_array – UInt32 配列。インデックスが範囲 [0, from_array.size()) の場合、ビットマップが from_array[idx] を含む場合、それを to_array[idx] で置き換えます。
  • to_arrayfrom_array と同じサイズの UInt32 配列。

SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), cast([5,999,2] as Array(UInt32)), cast([2,888,20] as Array(UInt32)))) AS res;

結果:

 ┌─res───────────────────┐
 │ [1,3,4,6,7,8,9,10,20] │
 └───────────────────────┘

bitmapAnd

二つのビットマップの論理積を計算します。

構文

bitmapAnd(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;

結果:

┌─res─┐
│ [3] │
└─────┘

bitmapOr

二つのビットマップの論理和を計算します。

構文

bitmapOr(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;

結果:

┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘

bitmapXor

二つのビットマップの排他的論理和を計算します。

構文

bitmapXor(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;

結果:

┌─res───────┐
│ [1,2,4,5] │
└───────────┘

bitmapAndnot

二つのビットマップの論理積を計算し、結果を否定します。

構文

bitmapAndnot(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;

結果:

┌─res───┐
│ [1,2] │
└───────┘

bitmapAndCardinality

二つのビットマップの論理積のカーディナリティを返します。

構文

bitmapAndCardinality(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;

結果:

┌─res─┐
│   1 │
└─────┘

bitmapOrCardinality

二つのビットマップの論理和のカーディナリティを返します。

bitmapOrCardinality(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;

結果:

┌─res─┐
│   5 │
└─────┘

bitmapXorCardinality

二つのビットマップの排他的論理和のカーディナリティを返します。

bitmapXorCardinality(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;

結果:

┌─res─┐
│   4 │
└─────┘

bitmapAndnotCardinality

二つのビットマップの AND-NOT 操作のカーディナリティを返します。

bitmapAndnotCardinality(bitmap,bitmap)

引数

  • bitmap – ビットマップオブジェクト。

SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;

結果:

┌─res─┐
│   2 │
└─────┘