Lorsque vos données métier contiennent des données constantes ou peuvent être séparées en tables de faits et de dimensions, utilisez des dictionnaires à la place des tables de dimension pour éviter les jointures (JOIN) et améliorer les performances des requêtes. Créez, modifiez et utilisez des dictionnaires externes dans Alibaba Cloud ClickHouse.
Prérequis
La source de données et le cluster cible doivent se trouver dans la même région et le même VPC, avec une liste d'autorisation d'adresses IP mutuelle. Si ce n'est pas le cas, résolvez d'abord les problèmes de connectivité. Résolution des problèmes de connectivité réseau entre un cluster cible et une source de données.
Exécutez SELECT * FROM system.clusters; pour afficher les adresses IP de votre cluster Alibaba Cloud ClickHouse.
Pour savoir comment configurer une liste d'autorisation d'adresses IP pour ClickHouse, consultez la rubrique Configuration d'une liste d'autorisation d'adresses IP.
Notes d'utilisation
Vous ne pouvez pas utiliser la console pour gérer les dictionnaires des clusters Alibaba Cloud ClickHouse exécutant la version 21.8 ou ultérieure. Gérez-les plutôt à l'aide d'instructions SQL telles que CREATE DICTIONARY.
Création d'une configuration de dictionnaire
Connectez-vous à la console ApsaraDB for ClickHouse.
Dans le coin supérieur gauche de la page, sélectionnez la région où se trouve le cluster cible.
Sur la page Clusters, cliquez sur l'onglet Clusters of Community-compatible Edition, puis cliquez sur l'ID de votre cluster cible.
Dans le volet de navigation de gauche, cliquez sur Dictionary Management.
Dans le coin supérieur droit de la page, cliquez sur Add Dictionary Configuration.
-
Dans la boîte de dialogue Add Dictionary Configuration, configurez les paramètres.
Le tableau suivant répertorie les principaux paramètres du dictionnaire. Pour la référence complète des paramètres, consultez la documentation Dictionaries.
Paramètre
Description
<name>
Nom personnalisé du dictionnaire. Doit être globalement unique.
<source>
Source de données du dictionnaire. Sources prises en charge :
-
MySQL
-
ClickHouse
<lifetime>
Fréquence de mise à jour des données du dictionnaire, en secondes.
<layout>
Disposition en mémoire du dictionnaire. Sept types sont disponibles :
-
Clé numérique
-
flat
-
hashed
-
range_hashed
-
cache
-
-
Clé composite
-
complex_key_hashed
-
complex_key_cache
-
ip_trie
-
<structure>
Structure des données du dictionnaire.
RemarqueVous ne pouvez ajouter qu'un seul nœud à la fois.
-
-
Une fois les paramètres configurés, cliquez sur OK. Le dictionnaire est créé.
Après la création, vous pouvez afficher, modifier ou supprimer le dictionnaire depuis la colonne Actions.
DDL des dictionnaires
Les clusters exécutant la version 20.8 ou ultérieure prennent en charge le DDL des dictionnaires pour créer directement des dictionnaires externes. Vérifiez la version de votre cluster sur la page Cluster Information dans la console.
CREATE DICTIONARY [IF NOT EXISTS] [db.]dictionary_name [ON CLUSTER cluster]
(
key1 type1 [DEFAULT|EXPRESSION expr1] [HIERARCHICAL|INJECTIVE|IS_OBJECT_ID],
key2 type2 [DEFAULT|EXPRESSION expr2] [HIERARCHICAL|INJECTIVE|IS_OBJECT_ID],
attr1 type2 [DEFAULT|EXPRESSION expr3],
attr2 type2 [DEFAULT|EXPRESSION expr4]
)
PRIMARY KEY key1, key2
SOURCE(SOURCE_NAME([param1 value1 ... paramN valueN]))
LAYOUT(LAYOUT_NAME([param_name param_value]))
LIFETIME([MIN val1] MAX val2)
Les exemples suivants illustrent la création de dictionnaires à partir de différentes sources de données.
Source : Alibaba Cloud ClickHouse
-
Préparez les données.
-
Créez une table source.
CREATE TABLE default.cities ( id UInt64, city_name String)ENGINE = Memory; -
Importez les données de test.
INSERT INTO default.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
-
-
Créez le dictionnaire.
CREATE DICTIONARY default.city_dict ( id UInt64, city_name String ) PRIMARY KEY id SOURCE(CLICKHOUSE( USER 'username' PASSWORD 'password' TABLE 'cities' DB 'default' )) LAYOUT(HASHED()) LIFETIME(MIN 300 MAX 360);
La source est un autre Alibaba Cloud ClickHouse
-
Préparez les données.
-
Créez une table source.
CREATE TABLE default.cities ( id UInt64, city_name String)ENGINE = Memory; -
Importez les données de test.
INSERT INTO default.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
-
-
Créez le dictionnaire.
CREATE DICTIONARY default.city_dict ( id UInt64, city_name String ) PRIMARY KEY id SOURCE(CLICKHOUSE( HOST 'cc-xxx.clickhouse.ads.aliyuncs.com' PORT 3306 USER 'username' PASSWORD 'password' DB 'default' TABLE 'cities' )) LAYOUT(HASHED()) LIFETIME(MIN 300 MAX 360);
ApsaraDB RDS for MySQL
-
Préparez les données dans l'instance ApsaraDB RDS for MySQL.
-
Créez une base de données et une table source.
CREATE DATABASE testdb; CREATE TABLE testdb.cities ( id INT PRIMARY KEY, city_name VARCHAR(255)); -
Importez les données de test.
INSERT INTO testdb.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
-
-
Créez le dictionnaire.
CREATE DICTIONARY default.city_dict ( id UInt64, city_name String ) PRIMARY KEY id SOURCE(MYSQL( HOST 'rm-xxx.mysql.rds.aliyuncs.com' PORT 3306 USER 'username' PASSWORD 'password' DB 'testdb' TABLE 'cities' )) LAYOUT(HASHED()) LIFETIME(MIN 300 MAX 360);
Requête personnalisée
-
Préparez les données.
-
Créez une table source.
CREATE TABLE default.cities ( id UInt64, city_name String)ENGINE = Memory; -
Importez les données de test.
INSERT INTO default.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
-
-
Créez le dictionnaire.
CREATE DICTIONARY default.my_dict ( id UInt64, city_name String ) PRIMARY KEY id SOURCE(CLICKHOUSE( USER 'username' PASSWORD 'password' DB 'default' QUERY 'SELECT id, city_name FROM default.cities where id<2' )) LAYOUT(HASHED()) LIFETIME(MIN 300 MAX 600);
Utilisation d'un dictionnaire
Interrogation des métadonnées du dictionnaire
SELECT
name,
type,
key,
attribute.names,
attribute.types,
bytes_allocated,
element_count,
source
FROM system.dictionaries
Interrogation des données du dictionnaire
Utilisez dictGet pour récupérer des données à partir d'un dictionnaire. Pour la syntaxe complète, consultez la documentation officielle de ClickHouse.
dictGet(<dict_name>, <attr_name>, <id_expr>)
dictGetOrDefault(<dict_name>, <attr_name>, <id_expr>, <default_value_expr>)