본문으로 바로가기
본문으로 바로가기

Map(K, V)

데이터 타입 Map(K, V)은 key-value 쌍을 저장합니다.

다른 데이터베이스와 달리 ClickHouse에서 맵은 유일(unique)하지 않습니다. 즉, 하나의 맵에 동일한 키를 가진 두 개의 요소가 포함될 수 있습니다. (이는 맵이 내부적으로 Array(Tuple(K, V))로 구현되어 있기 때문입니다.)

m에서 키 k에 대한 값을 얻기 위해 m[k] 구문을 사용할 수 있습니다. 또한 m[k]는 맵 전체를 스캔하므로, 연산 시간은 맵 크기에 비례하여 선형적으로 증가합니다.

파라미터

  • K — 맵 키(Map keys)의 타입입니다. Nullable 타입 및 Nullable 타입과 중첩된 LowCardinality 타입을 제외한 임의의 타입입니다.
  • V — 맵 값(Map values)의 타입입니다. 임의의 타입입니다.

예시

맵 타입 컬럼을 가진 테이블을 생성합니다:

CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});

key2 값을 선택하려면:

SELECT m['key2'] FROM tab;

결과:

┌─arrayElement(m, 'key2')─┐
│                      10 │
│                      20 │
│                      30 │
└─────────────────────────┘

요청한 키 k가 맵에 포함되어 있지 않으면 m[k]는 값 타입의 기본값을 반환합니다. 예를 들어 정수 타입은 0, 문자열 타입은 ''을(를) 반환합니다. 맵에 키가 존재하는지 확인하려면 mapContains 함수를 사용할 수 있습니다.

CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':100}), ({});
SELECT m['key1'] FROM tab;

결과:

┌─arrayElement(m, 'key1')─┐
│                     100 │
│                       0 │
└─────────────────────────┘

Tuple을 맵(Map)으로 변환하기

Tuple() 타입의 값은 함수 CAST를 사용하여 Map() 타입의 값으로 형변환할 수 있습니다.

예시

쿼리:

SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;

결과:

┌─map───────────────────────────┐
│ {1:'Ready',2:'Steady',3:'Go'} │
└───────────────────────────────┘

Map 서브컬럼 읽기

전체 맵을 모두 읽지 않도록, 상황에 따라 서브컬럼 keysvalues를 사용할 수 있습니다.

예제

쿼리:

CREATE TABLE tab (m Map(String, UInt64)) ENGINE = Memory;
INSERT INTO tab VALUES (map('key1', 1, 'key2', 2, 'key3', 3));

SELECT m.keys FROM tab; --   same as mapKeys(m)
SELECT m.values FROM tab; -- same as mapValues(m)

결과:

┌─m.keys─────────────────┐
│ ['key1','key2','key3'] │
└────────────────────────┘

┌─m.values─┐
│ [1,2,3]  │
└──────────┘

참고