You need to enable JavaScript to run this app.
导航

数据字典

最近更新时间2023.07.25 10:17:29

首次发布时间2023.07.25 10:17:29

ByteHouse 数据字典分为 内置字典外部扩展字典

  • 内置字典为 ClickHouse 预定义字典内容;
  • 外部扩展字典提供多种灵活的自定义的数据源定义,当前支持 MySQL、 PostgreSQL和 ClickHouse 。字典数据会定期更新,支持动态加载。

本文重点介绍如何操作 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})

使用字典表
  1. 查询字典数据

通过使用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,因为字典缓存通过该字段来索引。

  1. 删除字典
    ByteHouse将删除 Catalog中该字典的记录。
DROP DICTIONARY [IF EXISTS] [db.]dictionary_name;
  1. 查询字典
SHOW DICTIONARIES [FROM <db>]; 

如果未指定 FROM 子句,则查询将返回当前数据库中的词典列表。

  1. 查询创建字典语句
SHOW CREATE DICTIONARY [db.] dictionary_name

该查询语句返回一个字符串类型的“statement”列,该列包含一个值——用于创建指定对象的CREATE查询语句。

数据源配置样例
  1. MYSQL
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'
))
  1. ClickHouse
SOURCE(CLICKHOUSE(
    host 'example01-01-1'
    port 9000
    user 'default'
    password ''
    db 'default'
    table 'ids'
    where 'id=10'
))
  1. PostgreSQL
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'
))

最佳实践:使用 ClickHouse SQL字典

创建数据库

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();

创建字典
请自定义以下配置项,以保证连接到外部数据表:

  1. 主机地址 Host
  2. 端口 Port
  3. 用户名 Username
  4. 密码 Password
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;