数据字典创建
一、简单介绍
数据字典是ClickHouse提供一种非常简单、实用的存储媒介,他以键值和属性映射的形式定义数据。字典中的数据会主动或者被动加载到内存并支持动态更新。由于字典数据常驻内存的特性,所以非常适合保存常量或经常使用的维度表数据,以避免不必要的JOIN查询。
数据字典分为内置与扩展两种形式,内置字典是ClickHouse默认自带的字典,外部字典是用户通过自定义配置实现的字典。ClickHouse目前只有一种内置字典:Yandex.Metrica字典,这个字典是ClickHouse自家产品上的字典,设计目的是快速存取地理数据,但是ClickHouse没有将地理数据公布出来,内置字典默认是禁用状态,想要使用内置字典还需要模拟数据然后开启,功能十分有限。在使用ClickHouse 字典时,外部扩展字典才是更加常用的功能。
在正常情况下,字典中的数据只能通过字典函数访问,ClickHouse设置了一类字典函数,专门用于字典数据的取用。我们也可以通过字典表将字典数据挂载到一张代理的数据表下,从而访问字典中的数据,也可以实现数据表与字典数据的join查询。
二、字典创建
在ClickHouse20版本之前创建外部数据字典需要创建大量的xml文件来实现,在ClickHouse20.1版本之后引入了“Create dictionary”语句创建数据字典,创建字典表举例操作如下:
代码语言:javascript复制#创建新的库并使用
create database dic_test_db;
use dic_test_db;
#创建普通MergeTree表,描述地理位置表
CREATE TABLE loc_info(
uuid String,
local_id UInt64,
local_name String
)engine=MergeTree()
order by uuid;
#创建 数据字典表
CREATE DICTIONARY dic_loc_info(
local_id UInt64,
local_name String
)PRIMARY KEY local_id
SOURCE(ClickHouse(
HOST 'node1'
PORT 9000
USER 'default'
TABLE 'loc_info'
PASSWORD ''
DB 'dic_test_db'
))
LIFETIME (MIN 1 MAX 10)
LAYOUT(HASHED());
注意:以上创建字典表的参数解释如下:
HOST:指定ClickHouse节点名称
PORT:指定ClickHouse端口,默认9000
USER:连接ClickHouse用户名
PASSWORD:连接ClickHouse用户名对应密码
TABLE:此字典表映射的表名,字典表中的列名与映射表中列名一致。
DB:字典表映射表所在的库
LIFETIME:字典的自动更新频率
LAYOUT:字典的类型,决定了数据在内存中以何种结构组织和存储。目前扩展字典共拥有7种类型。
#创建普通用户表
CREATE TABLE person_info(
person_id String,
name String,
age UInt8,
loc_id UInt64
)engine=MergeTree()
order by person_id;
#向表loc_info中插入以下数据:
insert into loc_info values ('uuid1',100,'北京'),('uuid2',101,'上海'),('uuid3',102,'广州');
#向表 person_info中插入以下数据:
insert into person_info values ('1','张三',18,102),('2','李四',19,101),('1','王五',20,100);