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_typeとvalue_typeが変換可能かどうかに依存します。MAP<key_type, value_type>は他の型に変換することはできません。- 例:
MAP<INT, INT>はMAP<BIGINT, BIGINT>に変換できます。これはINTとBIGINTが変換可能であるためです。 - 文字列型は
MAP<key_type, value_type>に変換できます(パースを通じて、パースに失敗した場合はNULLを返します)。
- 例:
AGGREGATETableモデルでは、MAP<key_type, value_type>はREPLACEとREPLACE_IF_NOT_NULLのみをサポートします。すべてのTableモデルにおいて、KEYカラムとして使用することも、パーティションやバケットカラムとして使用することもできません。MAP<key_type, value_type>型のカラムは比較や算術演算をサポートせず、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} |
+---------------+
型の変更
- 変更は
MAP<key_type, value_type>の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としてのみ指定でき、一度指定すると変更できません。
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 |
+---------------------+------------------------------+------+-------+---------+-------+