본문으로 건너뛰기
최종 수정: 에

MAP

타입 설명​

  • MAP<key_type, value_type> 타입은 키와 값의 쌍으로 이루어진 복합 타입을 나타내며, 각 키는 하나의 값에 고유하게 대응합니다.
    • key_type은 키의 타입을 나타내며, BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE, DATETIME, TIMESTAMPTZ, CHAR, VARCHAR, STRING, IPV4, IPV6 등의 타입을 지원합니다. 키는 NULL을 허용하며 NOT NULL로 지정할 수 없습니다.
    • value_type은 값의 타입을 나타내며, BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE, DATETIME, TIMESTAMPTZ, CHAR, VARCHAR, STRING, IPV4, IPV6, ARRAY, MAP, STRUCT를 지원합니다. 값은 NULL을 허용하며 NOT NULL로 지정할 수 없습니다.

타입 제약 사항​

  • MAP<key_type, value_type> 타입은 최대 9단계까지 중첩할 수 있습니다.
  • MAP<key_type, value_type>에서 키는 NULL일 수 있으며, 동일한 키도 허용됩니다(NULL과 NULL은 같은 키로 간주됩니다).
  • MAP<key_type, value_type> 타입 간의 변환 가능 여부는 key_type과 value_type의 변환 가능 여부에 따라 결정됩니다. MAP<key_type, value_type>는 다른 타입으로 변환할 수 없습니다.
    • 예를 들어, MAP<INT, INT>는 MAP<BIGINT, BIGINT>로 변환할 수 있습니다. INT와 BIGINT 간에 변환이 가능하기 때문입니다.
    • 문자열 타입은 MAP<key_type, value_type>로 변환할 수 있습니다(파싱을 통해 변환하며, 파싱에 실패하면 NULL을 반환합니다).
  • AGGREGATE 테이블 모델에서 MAP<key_type, value_type>는 REPLACE와 REPLACE_IF_NOT_NULL만 지원합니다. 어떤 테이블 모델에서도 KEY 컬럼, 파티션 컬럼 또는 버킷 컬럼으로 사용할 수 없습니다.
  • MAP<key_type, value_type> 타입의 컬럼은 IN과 NOT IN을 포함한 비교 및 산술 연산을 지원하지 않으며, ORDER BY 및 GROUP BY 연산을 지원하지 않고, JOIN KEY로 사용하거나 DELETE 문에서 사용할 수 없습니다.
  • MAP<key_type, value_type> 타입의 컬럼에는 어떤 인덱스도 생성할 수 없습니다.

타입 생성​

  • MAP() 함수는 MAP 타입의 값을 반환할 수 있습니다.

    SELECT MAP('Alice', 21, 'Bob', 23);

    +-----------------------------+
    | map('Alice', 21, 'Bob', 23) |
    +-----------------------------+
    | {"Alice":21, "Bob":23} |
    +-----------------------------+
  • {}를 사용하여 MAP 타입의 값을 생성할 수 있습니다.

    SELECT {'Alice': 20};

    +---------------+
    | {'Alice': 20} |
    +---------------+
    | {"Alice":20} |
    +---------------+

타입 변경​

  • 변경은 key_type 또는 value_type이 해당 MAP<key_type, value_type> 타입에서 VARCHAR인 경우에만 허용됩니다.

    • VARCHAR의 매개변수 값은 늘리는 것만 허용되며 줄일 수는 없습니다.

      CREATE TABLE `map_table` (
      `k` INT NOT NULL,
      `map_varchar_int` MAP<VARCHAR(10), INT>,
      `map_int_varchar` MAP<INT, VARCHAR(10)>,
      `map_varchar_varchar` MAP<VARCHAR(10), VARCHAR(10)>
      ) ENGINE=OLAP
      DUPLICATE KEY(`k`)
      DISTRIBUTED BY HASH(`k`) BUCKETS 1
      PROPERTIES (
      "replication_num" = "1"
      );

      ALTER TABLE map_table MODIFY COLUMN map_varchar_int MAP<VARCHAR(20), INT>;

      ALTER TABLE map_table MODIFY COLUMN map_int_varchar MAP<INT, VARCHAR(20)>;

      ALTER TABLE map_table MODIFY COLUMN map_varchar_varchar MAP<VARCHAR(20), VARCHAR(20)>;
  • MAP<key_type, value_type> 타입 컬럼의 기본값은 NULL로만 지정할 수 있으며, 한 번 지정하면 변경할 수 없습니다.

요소 접근​

  • [key]를 사용하여 MAP에서 해당 키에 대응하는 값에 접근합니다.

    SELECT {'Alice': 20}['Alice'];

    +------------------------+
    | {'Alice': 20}['Alice'] |
    +------------------------+
    | 20 |
    +------------------------+
  • ELEMENT_AT(MAP, Key)를 사용하여 MAP에서 해당 키에 대응하는 값에 접근합니다.

    SELECT ELEMENT_AT({'Alice': 20}, 'Alice');

    +------------------------------------+
    | ELEMENT_AT({'Alice': 20}, 'Alice') |
    +------------------------------------+
    | 20 |
    +------------------------------------+

예제​

  • 중첩 MAP

    -- Create table
    CREATE TABLE IF NOT EXISTS map_table (
    id INT,
    map_nested MAP<STRING, MAP<STRING, INT>>
    ) ENGINE=OLAP
    DUPLICATE KEY(id)
    DISTRIBUTED BY HASH(id) BUCKETS 1
    PROPERTIES (
    "replication_allocation" = "tag.location.default: 1"
    );

    -- Insert
    INSERT INTO map_table VALUES (1, MAP('key1', MAP('key2', 1, 'key3', 2)));
    INSERT INTO map_table VALUES (2, MAP('key1', MAP('key2', 3, 'key3', 4)));

    -- Query
    SELECT map_nested['key1']['key2'] FROM map_table ORDER BY id;
    +----------------------------+
    | map_nested['key1']['key2'] |
    +----------------------------+
    | 1 |
    | 3 |
    +----------------------------+
  • 중첩 복합 타입

    -- Create table
    CREATE TABLE IF NOT EXISTS map_table (
    id INT,
    map_array MAP<STRING, ARRAY<INT>>
    ) ENGINE=OLAP
    DUPLICATE KEY(id)
    DISTRIBUTED BY HASH(id) BUCKETS 1
    PROPERTIES (
    "replication_allocation" = "tag.location.default: 1"
    );

    -- Insert
    INSERT INTO map_table VALUES (1, MAP('key1', [1, 2, 3])), (2, MAP('key1', [4, 5, 6]));

    -- Query
    SELECT map_array['key1'][1] FROM map_table ORDER BY id;
    +----------------------+
    | map_array['key1'][1] |
    +----------------------+
    | 1 |
    | 4 |
    +----------------------+

    -- Create table
    CREATE TABLE IF NOT EXISTS map_table (
    id INT,
    map_struct MAP<STRING, STRUCT<id: INT, name: STRING>>
    ) ENGINE=OLAP
    DUPLICATE KEY(id)
    DISTRIBUTED BY HASH(id) BUCKETS 1
    PROPERTIES (
    "replication_allocation" = "tag.location.default: 1"
    );

    -- Insert
    INSERT INTO map_table VALUES (1, MAP('key1', STRUCT(1, 'John'), 'key2', STRUCT(3, 'Jane')));

    -- Query
    SELECT STRUCT_ELEMENT(map_struct['key1'], 1), STRUCT_ELEMENT(map_struct['key1'], 'name') FROM map_table ORDER BY id;
    +---------------------------------------+--------------------------------------------+
    | STRUCT_ELEMENT(map_struct['key1'], 1) | STRUCT_ELEMENT(map_struct['key1'], 'name') |
    +---------------------------------------+--------------------------------------------+
    | 1 | John |
    +---------------------------------------+--------------------------------------------+
  • 타입 변경

    -- Create table
    CREATE TABLE `map_table` (
    `k` INT NOT NULL,
    `map_varchar_int` MAP<VARCHAR(10), INT>,
    `map_int_varchar` MAP<INT, VARCHAR(10)>,
    `map_varchar_varchar` MAP<VARCHAR(10), VARCHAR(10)>
    ) ENGINE=OLAP
    DUPLICATE KEY(`k`)
    DISTRIBUTED BY HASH(`k`) BUCKETS 1
    PROPERTIES (
    "replication_num" = "1"
    );

    -- Modify KEY
    ALTER TABLE map_table MODIFY COLUMN map_varchar_int MAP<VARCHAR(20), INT>;

    -- Modify VALUE
    ALTER TABLE map_table MODIFY COLUMN map_int_varchar MAP<INT, VARCHAR(20)>;

    -- Modify KEY and VALUE
    ALTER TABLE map_table MODIFY COLUMN map_varchar_varchar MAP<VARCHAR(20), VARCHAR(20)>;

    -- Check column types
    DESC map_table;
    +---------------------+------------------------------+------+-------+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +---------------------+------------------------------+------+-------+---------+-------+
    | k | int | No | true | NULL | |
    | map_varchar_int | map<varchar(20),int> | Yes | false | NULL | NONE |
    | map_int_varchar | map<int,varchar(20)> | Yes | false | NULL | NONE |
    | map_varchar_varchar | map<varchar(20),varchar(20)> | Yes | false | NULL | NONE |
    +---------------------+------------------------------+------+-------+---------+-------+