ByteHouse 数据字典分为 内置字典 和 外部扩展字典 :
本文重点介绍如何操作 ByteHouse 外部扩展字典。
您可以直接在SQL工作台使用DDL语句来新建字典表。
CREATE DICTIONARY [IF NOT EXISTS] [db.]dictionary_name ( 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 min_val MAX max_val | max_val})
通过使用dictGet / dictGetOrDefault 语句和函数获取数据字典中的数据。
dictGet('db.dict_name', 'attr_name', id_expr) dictGetOrDefault('db.dict_name', 'attr_name', id_expr, default_value_expr)
说明
dictGet函数的第一个参数的格式必须类似于 db.dict_name,因为字典缓存通过该字段来索引。
DROP DICTIONARY [IF EXISTS] [db.]dictionary_name;
SHOW DICTIONARIES [FROM <db>];
如果未指定 FROM
子句,则查询将返回当前数据库中的词典列表。
SHOW CREATE DICTIONARY [db.] dictionary_name
该查询语句返回一个字符串类型的“statement”列,该列包含一个值——用于创建指定对象的CREATE查询语句。
SOURCE(MYSQL( port 3306 user 'clickhouse' password 'qwerty' replica(host 'example01-1' priority 1) replica(host 'example01-2' priority 1) db 'db_name' table 'table_name' where 'id=10' invalidate_query 'SQL_QUERY' ))
SOURCE(CLICKHOUSE( host 'example01-01-1' port 9000 user 'default' password '' db 'default' table 'ids' where 'id=10' ))
SOURCE(POSTGRESQL( port 5432 host 'postgresql-hostname' user 'postgres_user' password 'postgres_password' db 'db_name' table 'table_name' replica(host 'example01-1' port 5432 priority 1) replica(host 'example01-2' port 5432 priority 2) where 'id=10' invalidate_query 'SQL_QUERY' query 'SELECT id, value_1, value_2 FROM db_name.table_name' ))
创建数据库
Create Database test_db;
创建数据表
CREATE TABLE `test_db`.`range_key_dictionary_source_table` COMMENT '' ( `key` UInt64, `start_date` Date, `end_date` Date, `value` String, `value_nullable` Nullable(String) ) ENGINE=CnchMergeTree() PRIMARY KEY tuple() ORDER BY tuple();
创建字典
请自定义以下配置项,以保证连接到外部数据表:
CREATE DICTIONARY test_db.range_key_dictionary( `key` UInt64, `start_date` Date, `end_date` Date, `value` String, `value_nullable` String ) PRIMARY KEY `key` SOURCE(CLICKHOUSE(HOST 'your_host' PORT 'your_port' TABLE 'range_key_dictionary_source_table' DB 'test_db' USER 'your_username' PASSWORD 'your_password')) LIFETIME(MIN 10 MAX 20) LAYOUT(FLAT()) ;
删除字典
DROP dictionary test_db.range_key_dictionary;