비트맵 함수
비트맵 함수 (Bitmap Functions)
비트맵(bitmap) 자료 구조로 집합 연산을 수행하는 함수 모음이에요. 비트맵은 두 가지 방법으로 만들 수 있어요. 첫 번째는 -State와 함께 쓰는 집계 함수 groupBitmap으로 만드는 것이고, 다른 하나는 Array 객체에서 비트맵을 구성하는 것이에요.
출처: 문서
본문
비트맵은 두 가지 방법으로 만들 수 있어요. 첫 번째는 -State와 함께 쓰는 집계 함수 groupBitmap으로 만드는 것이고, 다른 하나는 Array 객체에서 비트맵을 구성하는 것이에요.
bitmapAnd
두 비트맵의 논리곱(AND)을 계산해요.
구문 (Syntax)
bitmapAnd(bitmap1, bitmap2)
인자 (Arguments)
bitmap1— 첫 번째 비트맵 객체.AggregateFunction(groupBitmap, T)bitmap2— 두 번째 비트맵 객체.AggregateFunction(groupBitmap, T)
반환 값 (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)
array— 정수 배열.Array((U)Int*)
반환 값 (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)
bitmap— 비트맵 객체.AggregateFunction(groupBitmap, T)
반환 값 (Returned value)
비트맵에서 설정된 비트의 수. UInt64
예제 (Examples)
SELECT bitmapCardinality(bitmapBuild([1, 3, 3, 5, 7, 7])) AS res; -- 4
bitmapContains
비트맵이 특정 요소를 포함하는지 확인해요. 값은 비트맵 요소 타입의 부호 없는 정수로 비교돼요. 부호 있는 비트맵의 경우 음수 요소는 부호 없는 대응값과 일치해요(예: Int8 값 -1은 255와 일치).
구문 (Syntax)
bitmapContains(bitmap, value)
인자 (Arguments)
bitmap— 비트맵 객체.AggregateFunction(groupBitmap, T)value— 확인할 요소.(U)Int8/16/32/64](/docs/reference/data-types/int-uint)
반환 값 (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 값 -1은 255). 비트맵이 비어 있으면 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 값 -128은 128). 비트맵이 비어 있으면 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)
bitmap— 하위 집합을 추출할 비트맵.AggregateFunction(groupBitmap, T)start— 범위의 시작(포함).UInt*end— 범위의 끝(제외).UInt*
반환 값 (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)
bitmap— 비트맵 객체.AggregateFunction(groupBitmap, T)range_start— 범위의 시작(포함).UInt32cardinality_limit— 하위 집합의 최대 카디널리티.UInt32
반환 값 (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)
bitmap— 변환할 비트맵.AggregateFunction(groupBitmap, T)
반환 값 (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 값 -1은 255). to_array의 값이 비트맵 요소 타입에 맞지 않으면 BAD_ARGUMENTS를 발생시켜요. from_array의 값이 맞지 않으면 그냥 찾지 못해 해당 교체가 적용되지 않아요.
구문 (Syntax)
bitmapTransform(bitmap, from_array, to_array)
인자 (Arguments)
bitmap— 비트맵 객체.AggregateFunction(groupBitmap, T)from_array— 교체될 원래 설정 비트의 배열.Array(T)to_array— 교체에 사용할 새 설정 비트의 배열.Array(T)
반환 값 (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)
bitmap— 비트맵 객체.AggregateFunction(groupBitmap, T)offset— 시작부터 건너뛸 설정 비트의 수(0 기반).UInt32cardinality_limit— 하위 집합에 포함할 설정 비트의 최대 수.UInt32
반환 값 (Returned value)
부호 없는 값 오름차순으로 offset개 요소를 건너뛴 후 최대 cardinality_limit개의 요소를 담은 비트맵. AggregateFunction(groupBitmap, T)
예제 (Examples)
SELECT bitmapToArray(subBitmap(bitmapBuild([1, 2, 3, 4, 5]), 2, 2)) AS res; -- [3,4]