Перейти к основному содержимому
Перейти к основному содержимому

Битовые функции

Битовые карты могут быть созданы двумя способами. Первый способ — это конструкция с помощью функции агрегации groupBitmap с -State, второй способ — создать битовую карту из объекта массива.

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)

Аргументы

  • bitmap – Битовоя карта. Объект битовой карты.
  • offset – Позиция первого элемента подмножества. UInt32.
  • cardinality_limit – Максимальное количество элементов в подмножестве. UInt32.

Пример

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 — Если bitmap не содержит needle. UInt8.
  • 1 — Если bitmap содержит needle. 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, если bitmap1 и bitmap2 имеют хотя бы один общий элемент.
  • 0, в противном случае.

Пример

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

Результат:

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

bitmapHasAll

Возвращает 1, если первая битовая карта содержит все элементы второй битовой карты, в противном случае 0. Если вторая битовая карта пуста, возвращает 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, если битовая карта пуста (UINT64_MAX, если тип >= 8 бит).

Синтаксис

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. Для idx в диапазоне [0, from_array.size()), если битовая карта содержит from_array[idx], то замените его на to_array[idx].
  • to_array – Массив UInt32 того же размера, что и from_array.

Пример

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

Вычисляет XOR двух битовых карт.

Синтаксис

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

Возвращает кардинальность XOR двух битовых карт.

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 │
└─────┘