メインコンテンツまでスキップ
バージョン: 26.x

MAP

型説明

  • MAP<key_type, value_type>型は、各キーが値に一意に対応するキー・値ペアの複合型を表すために使用されます。
    • key_typeはキーの型を表し、BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE, DATETIME, CHAR, VARCHAR, STRING, IPV4, IPV6などの型をサポートします。キーはnullableであり、NOT NULLとして指定することはできません。
    • value_typeは値の型を表し、BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE, DATETIME, CHAR, VARCHAR, STRING, IPV4, IPV6, ARRAY, MAP, STRUCTをサポートします。値はnullableであり、NOT NULLとして指定することはできません。

型制約

  • MAP<key_type, value_type>型は最大9レベルのネスト深度を許可します。
  • MAP<key_type, value_type>では、キーはNULLになることができ、同一のキーが許可されます(NULLとNULLは同じキーとして扱われます)。
  • MAP<key_type, value_type>型間の変換は、key_typevalue_typeが変換可能かどうかに依存します。MAP<key_type, value_type>は他の型に変換することはできません。
    • 例:MAP<INT, INT>MAP<BIGINT, BIGINT>に変換できます。これはINTBIGINTが変換可能であるためです。
    • 文字列型はMAP<key_type, value_type>に変換できます(パースを通じて、パースに失敗した場合はNULLを返します)。
  • AGGREGATETableモデルでは、MAP<key_type, value_type>REPLACEREPLACE_IF_NOT_NULLのみをサポートします。すべてのTableモデルにおいて、KEYカラムとして使用することも、パーティションやバケットカラムとして使用することもできません
  • MAP<key_type, value_type>型のカラムは比較や算術演算をサポートせず、ORDER BYGROUP 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} |
+---------------+

型の変更

  • 変更は MAP<key_type, value_type>key_type または value_typeVARCHAR の場合のみ許可されます。
    • 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としてのみ指定でき、一度指定すると変更できません。

Element Access

  • MAP内のキーに対応する値にアクセスするには[key]を使用します。

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

    +------------------------+
    | {'Alice': 20}['Alice'] |
    +------------------------+
    | 20 |
    +------------------------+
  • MAP内のキーに対応する値にアクセスするには、ELEMENT_AT(MAP, Key)を使用します。

    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 | タイプ | 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 |
    +---------------------+------------------------------+------+-------+---------+-------+