データウェアハウスの開発とデータ分析において、ビジネスデータに定数が含まれている場合、またはファクトテーブルとディメンションテーブルに分割できる場合は、ディクショナリを使用してディメンションテーブルを置き換えることができます。このメソッドは JOIN 文の使用を回避し、クエリ効率を向上させます。このトピックでは、ApsaraDB for ClickHouse でディクショナリを作成、変更、使用する方法について説明します。
前提条件
データソースと宛先は同じリージョンと VPC にあり、互いの IP アドレスをそれぞれのホワイトリストに追加している必要があります。これらの条件が満たされない場合は、まずネットワーク接続の問題を解決する必要があります。詳細については、「宛先クラスターとデータソース間のネットワーク接続の問題を解決する方法」をご参照ください。
ApsaraDB for ClickHouse クラスターの IP アドレスを確認するには、SELECT * FROM system.clusters; を実行します。
ClickHouse の IP ホワイトリストの設定方法の詳細については、「ホワイトリストを設定する」をご参照ください。
注意
バージョン 21.8 以降の ApsaraDB for ClickHouse クラスターのディクショナリは、コンソールで管理できません。代わりに、SQL 文を使用してディクショナリを表示および作成できます。詳細については、「CREATE DICTIONARY」をご参照ください。
ディクショナリ構成の作成
ApsaraDB for ClickHouse コンソールにログインします。
上部のナビゲーションバーで、管理するクラスターがデプロイされているリージョンを選択します。
[クラスター] ページで、[Community Edition インスタンス] タブをクリックし、ターゲットクラスター ID をクリックします。
左側のナビゲーションウィンドウで、[ディクショナリ管理] をクリックしてディクショナリ管理ページを開きます。
右上隅にある [ディクショナリ構成の追加] をクリックします。
[ディクショナリ構成の追加] ダイアログボックスで、テンプレートを編集し、ディクショナリの内容を指定します。
このトピックでは、ディクショナリ構成の主要なパラメーターのみを説明します。詳細については、「ディクショナリ」をご参照ください。
パラメーター
説明
<name>
ディクショナリのカスタム名。名前はグローバルに一意である必要があります。
<source>
ディクショナリのデータソース。ApsaraDB for ClickHouse は、次のデータソースをサポートしています:
MySQL
ClickHouse
<lifetime>
ディクショナリ内のデータの更新頻度。単位: 秒。
<layout>
ディクショナリレイアウトは、データがメモリにどのように格納されるかを定義します。ApsaraDB for ClickHouse ディクショナリは、次の 7 つのレイアウトをサポートしています:
数値キー
flat
hashed
range_hashed
cache
複合キー
complex_key_hashed
complex_key_cache
ip_trie
<structure>
ディクショナリのデータ構造。
説明一度に追加できるノードは 1 つだけです。
[OK] をクリックしてデータディクショナリを作成します。
ディクショナリが作成された後、[アクション] 列で表示、削除、または変更できます。
DDL クエリを使用したディクショナリの作成
バージョン 20.8 以降、ApsaraDB for ClickHouse クラスターはディクショナリのデータ定義言語 (DDL) をサポートしています。DDL 文を使用して新しいディクショナリを直接作成できます。クラスターのバージョンを確認するには、ApsaraDB for ClickHouse コンソールにログインし、[クラスター情報] ページに移動します。
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)次の例は、さまざまなソースからディクショナリを作成する方法を示しています。
現在の ApsaraDB for ClickHouse インスタンスから
データを準備します。
ソーステーブルを作成します。
CREATE TABLE default.cities (id UInt64, city_name String)ENGINE = Memory;テストデータをインポートします。
INSERT INTO default.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
ディクショナリを作成します。
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);
別の ApsaraDB for ClickHouse インスタンスから
データを準備します。
ソーステーブルを作成します。
CREATE TABLE default.cities ( id UInt64, city_name String)ENGINE = Memory;テストデータをインポートします。
INSERT INTO default.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
ディクショナリを作成します。
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);
RDS MySQL インスタンスから
RDS for MySQL インスタンスでデータを準備します。
データベースとソーステーブルを作成します。
CREATE DATABASE testdb; CREATE TABLE testdb.cities ( id INT PRIMARY KEY, city_name VARCHAR(255));テストデータをインポートします。
INSERT INTO testdb.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
ディクショナリを作成します。
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);
クエリ文を使用したディクショナリテーブル
データを準備します。
ソーステーブルを作成します。
CREATE TABLE default.cities ( id UInt64, city_name String)ENGINE = Memory;テストデータをインポートします。
INSERT INTO default.cities (id, city_name) VALUES(1, 'Beijing'),(2, 'Shanghai'),(3, 'Guangzhou'),(4, 'Shenzhen');
ディクショナリを作成します。
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);
ディクショナリの使用
ディクショナリのメタデータを一覧表示する
SELECT
name,
type,
key,
attribute.names,
attribute.types,
bytes_allocated,
element_count,
source
FROM system.dictionaries;ディクショナリからデータを取得する
dictGet 関数を使用して、ディクショナリからデータを取得できます。dictGet 関数の詳細については、「ClickHouse の公式ドキュメント」をご参照ください。
dictGet(<dict_name>, <attr_name>, <id_expr>)
dictGetOrDefault(<dict_name>, <attr_name>, <id_expr>, <default_value_expr>)