Le type MAP stocke des paires clé-valeur. Il est pris en charge par AnalyticDB for MySQL 3.1.1 et versions ultérieures.
Définition
Une colonne MAP associe des clés à des valeurs :
Les clés doivent être d'un type de données primitif :
TINYINT,BOOLEAN,SMALLINT,INT,BIGINT,FLOAT,DOUBLEouSTRING.Les valeurs peuvent être d'un type de données primitif, ou de type MAP ou ARRAY, ce qui permet de créer des structures imbriquées.
Par exemple, définissez map<int, string> pour une map simple, ou map<int, map<int, string>> pour une map imbriquée.
Notes d'utilisation
Les index ne sont pas pris en charge sur les colonnes MAP ou ARRAY. Utilisez des conditions de filtrage dans les instructions SQL pour réduire la quantité de données analysées.
Les clés doivent être uniques au sein d'une map.
L'ordre d'insertion des clés n'est pas conservé. Par exemple, l'insertion de
{"a":1,"b":2,"d":3}peut renvoyer{"d":3,"a":1,"b":2}.
Exemples
Créer une table
CREATE TABLE map_test (
`a` INT,
`b` MAP<INT, STRING>,
`c` MAP<INT, MAP<INT, STRING>>,
PRIMARY KEY (`a`)
) DISTRIBUTED BY HASH(`a`);
Insérer des données
INSERT INTO map_test VALUES (1, '{1:"a"}', '{1:{11:"a"},2:{22:"b"}}');
Interroger des données
SELECT * FROM map_test;
+------+---------+-------------------------+
| a | b | c |
+------+---------+-------------------------+
| 1 | {1:"a"} | {1:{11:"a"},2:{22:"b"}} |
+------+---------+-------------------------+
1 row in set (0.07 sec)
Utilisez element_at pour récupérer une valeur par clé. L'argument est une clé, et non un indice.
SELECT element_at(c, 1), element_at(element_at(c, 1), 11) FROM map_test;
+-----------------+--------------------------------+
| element_at(c,1) | element_at(element_at(c,1),11) |
+-----------------+--------------------------------+
| {11:"a"} | a |
+-----------------+--------------------------------+
1 row in set (0.07 sec)
Utilisez map_keys et map_values pour extraire toutes les clés ou toutes les valeurs sous forme de tableau. La fonction size renvoie le nombre total combiné de clés et de valeurs.
SELECT map_keys(b), map_values(b), size(b), size(map_keys(b)), size(map_values(b)) FROM map_test;
+-------------+---------------+---------+-------------------+---------------------+
| map_keys(b) | map_values(b) | size(b) | size(map_keys(b)) | size(map_values(b)) |
+-------------+---------------+---------+-------------------+---------------------+
| [1] | ["a"] | 2 | 1 | 1 |
+-------------+---------------+---------+-------------------+---------------------+
1 row in set (0.08 sec)
SELECT map_keys(c), map_values(c), size(c), size(map_keys(c)), size(map_values(c)) FROM map_test;
+-------------+---------------------+---------+-------------------+---------------------+
| map_keys(c) | map_values(c) | size(c) | size(map_keys(c)) | size(map_values(c)) |
+-------------+---------------------+---------+-------------------+---------------------+
| [1,2] | [{11:"a"},{22:"b"}] | 4 | 2 | 2 |
+-------------+---------------------+---------+-------------------+---------------------+
1 row in set (0.08 sec)
Fonctions prises en charge
| Fonction | Description | Exemple | Type de retour |
|---|---|---|---|
element_at |
Renvoie la valeur correspondant à une clé donnée. | element_at(map(array["a","b"], array[1,2]), a) → 1 |
V |
size |
Renvoie le nombre total de clés et de valeurs. | size(map(array["a","b"], array[1,2])) → 4 |
INT |
map_keys |
Renvoie toutes les clés sous forme de tableau. | map_keys(map(array["a","b"], array[1,2])) → ["a","b"] |
ARRAY |
map_values |
Renvoie toutes les valeurs sous forme de tableau. | map_values(map(array["a","b"], array[1,2])) → [1,2] |
ARRAY |