비트맵 함수

비트맵 함수 (Bitmap Functions)

비트맵(bitmap) 자료 구조로 집합 연산을 수행하는 함수 모음이에요. 비트맵은 두 가지 방법으로 만들 수 있어요. 첫 번째는 -State와 함께 쓰는 집계 함수 groupBitmap으로 만드는 것이고, 다른 하나는 Array 객체에서 비트맵을 구성하는 것이에요.

출처: 문서

본문

비트맵은 두 가지 방법으로 만들 수 있어요. 첫 번째는 -State와 함께 쓰는 집계 함수 groupBitmap으로 만드는 것이고, 다른 하나는 Array 객체에서 비트맵을 구성하는 것이에요.

bitmapAnd

두 비트맵의 논리곱(AND)을 계산해요.

구문 (Syntax)

bitmapAnd(bitmap1, bitmap2)

인자 (Arguments)

반환 값 (Returned value)

두 입력 비트맵 모두에 존재하는 비트를 담은 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

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

bitmapAndCardinality

두 비트맵의 논리곱(AND)의 카디널리티(집합 원소 수)를 반환해요.

구문 (Syntax)

bitmapAndCardinality(bitmap1, bitmap2)

반환 값 (Returned value)

두 비트맵의 교집합에서 설정된 비트의 수. UInt64

예제 (Examples)

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

bitmapAndnot

두 비트맵의 집합 차집합 A AND-NOT B를 계산해요.

구문 (Syntax)

bitmapAndnot(bitmap1, bitmap2)

반환 값 (Returned value)

첫 번째 비트맵에는 있지만 두 번째에는 없는 설정 비트를 담은 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

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

bitmapAndnotCardinality

두 비트맵의 AND-NOT 연산의 카디널리티를 반환해요.

구문 (Syntax)

bitmapAndnotCardinality(bitmap1, bitmap2)

반환 값 (Returned value)

bitmap1 AND-NOT bitmap2 결과에서 설정된 비트의 수. UInt64

예제 (Examples)

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

bitmapBuild

정수 배열에서 비트맵을 만들어요. 지원되는 요소 타입은 8, 16, 32, 64비트의 부호 있는/없는 정수예요. bitmapToArray 함수의 반대예요.

구문 (Syntax)

bitmapBuild(array)

인자 (Arguments)

반환 값 (Returned value)

제공된 배열에서 만든 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

SELECT hex(bitmapBuild([1, 2, 3, 4, 5])) AS res, toTypeName(bitmapBuild([1, 2, 3, 4, 5])) AS type;

응답: {res: "00050102030405", type: "AggregateFunction(groupBitmap, UInt8)"}

bitmapCardinality

비트맵에서 설정된 비트의 수(카디널리티)를 반환해요.

구문 (Syntax)

bitmapCardinality(bitmap)

인자 (Arguments)

반환 값 (Returned value)

비트맵에서 설정된 비트의 수. UInt64

예제 (Examples)

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

bitmapContains

비트맵이 특정 요소를 포함하는지 확인해요. 값은 비트맵 요소 타입의 부호 없는 정수로 비교돼요. 부호 있는 비트맵의 경우 음수 요소는 부호 없는 대응값과 일치해요(예: Int8-1255와 일치).

구문 (Syntax)

bitmapContains(bitmap, value)

인자 (Arguments)

반환 값 (Returned value)

비트맵이 지정된 값을 포함하면 1, 그렇지 않으면 0. UInt8

예제 (Examples)

SELECT bitmapContains(bitmapBuild([1, 2, 3]), 2) AS res;  -- 1
SELECT bitmapContains(bitmapBuild([-1]::Array(Int8)), 255) AS res;  -- 1

bitmapHasAll

첫 번째 비트맵이 두 번째 비트맵의 모든 설정 비트를 포함하는지 확인해요.

구문 (Syntax)

bitmapHasAll(bitmap1, bitmap2)

반환 값 (Returned value)

두 번째 비트맵의 모든 설정 비트가 첫 번째 비트맵에 있으면 1, 그렇지 않으면 0. UInt8

예제 (Examples)

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

bitmapHasAny

첫 번째 비트맵이 두 번째 비트맵의 설정 비트를 하나라도 포함하는지 확인해요.

구문 (Syntax)

bitmapHasAny(bitmap1, bitmap2)

반환 값 (Returned value)

두 번째 비트맵의 어떤 비트라도 첫 번째 비트맵에 있으면 1, 그렇지 않으면 0. UInt8

예제 (Examples)

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

bitmapMax

비트맵에서 가장 큰 요소를 비트맵 요소 타입의 부호 없는 정수로 해석해 반환해요. 부호 있는 비트맵의 경우 음수 값은 부호 없는 대응값으로 취급돼요(예: Int8-1255). 비트맵이 비어 있으면 0을 반환해요.

구문 (Syntax)

bitmapMax(bitmap)

반환 값 (Returned value)

비트맵 요소 타입의 부호 없는 값으로 표현된 가장 큰 요소, 비트맵이 비어 있으면 0. UInt64

예제 (Examples)

SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res;  -- 5
SELECT bitmapMax(bitmapBuild([-128, -1]::Array(Int8))) AS res;  -- 255

bitmapMin

비트맵에서 가장 작은 요소를 비트맵 요소 타입의 부호 없는 정수로 해석해 반환해요. 부호 있는 비트맵의 경우 음수 값은 부호 없는 대응값으로 취급돼요(예: Int8-128128). 비트맵이 비어 있으면 UINT32_MAX(비트맵 요소 타입이 32비트보다 넓으면 UINT64_MAX)를 반환해요.

구문 (Syntax)

bitmapMin(bitmap)

반환 값 (Returned value)

비트맵 요소 타입의 부호 없는 값으로 표현된 가장 작은 요소, 비트맵이 비어 있으면 UINT32_MAX/UINT64_MAX. UInt64

예제 (Examples)

SELECT bitmapMin(bitmapBuild([3, 5, 2, 6])) AS res;  -- 2
SELECT bitmapMin(bitmapBuild([-128, -1]::Array(Int8))) AS res;  -- 128

bitmapOr

두 비트맵의 논리합(OR)을 계산해요.

구문 (Syntax)

bitmapOr(bitmap1, bitmap2)

반환 값 (Returned value)

어느 한쪽 입력 비트맵에 존재하는 설정 비트를 담은 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

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

bitmapOrCardinality

두 비트맵의 논리합(OR)의 카디널리티를 반환해요.

구문 (Syntax)

bitmapOrCardinality(bitmap1, bitmap2)

반환 값 (Returned value)

두 비트맵의 합집합에서 설정된 비트의 수. UInt64

예제 (Examples)

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

bitmapSubsetInRange

값 범위 [start, end) 안의 요소를 담은 비트맵의 하위 집합을 반환해요. 요소 값은 비트맵 요소 타입의 부호 없는 정수로 비교돼요.

구문 (Syntax)

bitmapSubsetInRange(bitmap, start, end)

인자 (Arguments)

반환 값 (Returned value)

지정된 값 범위 안의 요소만 담은 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

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

bitmapSubsetLimit

값이 range_start보다 크거나 같은 요소 중에서 부호 없는 순서로 가장 작은 값을 최대 cardinality_limit개 선택한 하위 집합을 반환해요.

구문 (Syntax)

bitmapSubsetLimit(bitmap, range_start, cardinality_limit)

인자 (Arguments)

반환 값 (Returned value)

부호 없는 값이 range_start 이상인 요소를 최대 cardinality_limit개 담은 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

SELECT arraySort(bitmapToArray(bitmapSubsetLimit(bitmapBuild([1, 5, 3, 2, 8]), 3, 2))) AS res;  -- [3,5]

bitmapToArray

비트맵을 요소의 배열로 변환해요. 배열 요소 타입은 비트맵 요소 타입 T(부호 있는/없는 정수)와 일치해요. bitmapBuild 함수의 반대예요.

구문 (Syntax)

bitmapToArray(bitmap)

인자 (Arguments)

반환 값 (Returned value)

비트맵에 담긴 요소의 배열. Array(T)

예제 (Examples)

SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res;  -- [1,2,3,4,5]
SELECT arraySort(bitmapToArray(bitmapBuild([-128, -1]::Array(Int8)))) AS res;  -- [-128,-1]

bitmapTransform

from_array에서 to_array로의 매핑에 따라 비트맵의 요소를 교체해요. 값은 비트맵 요소 타입의 부호 없는 정수로 해석돼요(bitmapContains와 같은 도메인). 부호 있는 비트맵의 경우 음수 요소는 부호 없는 대응값과 일치해요(예: Int8-1255). to_array의 값이 비트맵 요소 타입에 맞지 않으면 BAD_ARGUMENTS를 발생시켜요. from_array의 값이 맞지 않으면 그냥 찾지 못해 해당 교체가 적용되지 않아요.

구문 (Syntax)

bitmapTransform(bitmap, from_array, to_array)

인자 (Arguments)

반환 값 (Returned value)

주어진 매핑에 따라 요소가 변환된 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

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

bitmapXor

두 비트맵의 대칭 차집합(XOR)을 계산해요.

구문 (Syntax)

bitmapXor(bitmap1, bitmap2)

반환 값 (Returned value)

어느 한쪽 입력 비트맵에는 있지만 양쪽 모두에는 없는 설정 비트를 담은 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

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

bitmapXorCardinality

두 비트맵의 XOR(대칭 차집합)의 카디널리티를 반환해요.

구문 (Syntax)

bitmapXorCardinality(bitmap1, bitmap2)

반환 값 (Returned value)

두 비트맵의 대칭 차집합에서 설정된 비트의 수. UInt64

예제 (Examples)

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

subBitmap

부호 없는 값 오름차순으로 offset개의 요소를 건너뛴 후 비트맵의 하위 집합을 반환해요. 반환된 비트맵의 최대 카디널리티는 cardinality_limit이에요.

구문 (Syntax)

subBitmap(bitmap, offset, cardinality_limit)

인자 (Arguments)

반환 값 (Returned value)

부호 없는 값 오름차순으로 offset개 요소를 건너뛴 후 최대 cardinality_limit개의 요소를 담은 비트맵. AggregateFunction(groupBitmap, T)

예제 (Examples)

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

더 알아보기 (Learn more)