Clickhouse Dictionaries 使用样例

Clickhouse Dictionaries 字典使用

clickhouse支持从各种数据源添加自己的字典。字典的数据源可以是本地文本、可执行文件
、HTTP(s)资源或其他DBMS。有关更多信息,请参阅“外部词典的来源”。

  • 完全或部分将字典存储在RAM中。
  • 定期更新字典并动态加载缺失值。换句话说,可以动态加载字典。

外部词典的配置位于一个或多个文件中。 配置的路径在dictionaries_config参数中指定。

字典配置:
*_dictionary.xml

当前配置文件目录下,以_dictionary.xml结尾的均作为字典配置文件进行字典加载。
字典可以在服务器启动时或首次使用时加载,具体取决于dictionaries_lazy_load设置。

字典懒加载
true

如果设置为true, 每个字典只在第一次使用时创建. 如果字典创建失败,则会在调用字典函数时抛出异常.
如果设置为false,所有字典则会在服务器启动时加载,如果加载过程中有异常,则会shutdown 服务。
以mysql为例,尝试下Clickhouse的字典功能。最后的配置附录中包括:

  • 以 flat形式存储的Numeric keyKey类型的字典
  • 以 complex_key_hashed形式存储的Composite keyKey类型的字典

    建立外部字典

    MYSQL 中建立测试表test_dict,并添加3条记录

    ```sql SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;

— Table structure for test_dict


DROP TABLE IF EXISTS test_dict; CREATE TABLE test_dict ( id int(11) NOT NULL, code varchar(20) NOT NULL, name varchar(200) DEFAULT NULL, status tinyint(4) NOT NULL DEFAULT ‘1’, PRIMARY KEY (id) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


— Records of test_dict


BEGIN; INSERT INTO test_dict VALUES (1, ‘f’, ‘女性’, 1); INSERT INTO test_dict VALUES (2, ‘m’, ‘男性’, 1); INSERT INTO test_dict VALUES (3, ‘cat’, ‘猫’, 1); COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

  1. <a name="IFa9E"></a>
  2. #### 在clickhouse 配置文件目录建立字典配置文件
  3. > vi tmysql_dictionary.xml
  4. `tmysql_dictionary.xml`内容如下:
  5. ```xml
  6. <dictionaries>
  7. <dictionary>
  8. <name>dicts</name><!--字典名称-->
  9. <source>
  10. <mysql><!--dbms类型:mysql-->
  11. <replica><!--mysql 服务器,多台/主从可以配置多个-->
  12. <host>116.255.199.xx</host>
  13. <priority>1</priority><!--优先级-->
  14. </replica>
  15. <port>3306</port><!--端口-->
  16. <user>xxxx</user><!--mysql用户名-->
  17. <password>xxxxx</password><!--mysql 密码-->
  18. <db>db_benchmark</db><!--数据库-->
  19. <table>test_dict</table><!--表-->
  20. <where>status=1</where><!--过滤条件-->
  21. <invalidate_query>select count(*) from test_dict where status=1</invalidate_query><!--如果该查询结果发生变更,则更新字典-->
  22. </mysql>
  23. </source>
  24. <lifetime><!--clickhouse 会在这个时间间隔范围内,随机均匀时间进行字典升级(负载均衡),避免大量同时升级字典源-->
  25. <min>300</min>
  26. <max>360</max>
  27. </lifetime>
  28. <layout><!--字典在内存中存储方式;flat:二维数组(flat arrays),其他类型见文档-->
  29. <flat/>
  30. </layout>
  31. <structure>
  32. <id>
  33. <name>id</name><!--主键,好像必须是正整数型(UInt64)-->
  34. </id>
  35. <attribute><!--其他属性-->
  36. <name>code</name><!--属性名称-->
  37. <type>String</type><!--属性类型-->
  38. <null_value></null_value><!--null值替换-->
  39. </attribute>
  40. <attribute>
  41. <name>name</name>
  42. <type>String</type>
  43. <null_value></null_value>
  44. </attribute>
  45. </structure>
  46. </dictionary>
  47. </dictionaries>

重新启动clickhouse服务,测试

clickhouse-server –config-file=/etc/clickhouse-server/config.xml clickhouse-client -m

select * from system.dictionaries where name =’dicts’;

字典的使用

字典函数

具体函数见:ext_dict_functions
Clickhouse Dictionaries 使用样例 - 图1
当需要对字典使用原始数据或者执行join操作时,则可以使用Dictionary engine建立字典视图
创建字典视图语法:

CREATETABLE %table_name% (%fields%) engine = Dictionary(%dictionary_name%)`

  1. create table test_dicts(
  2. id UInt64,
  3. code String
  4. ,name String
  5. )
  6. engine=Dictionary('dicts');
  7. select * from test_dicts;

Clickhouse Dictionaries 使用样例 - 图2

配置文件附录

  • 以 flat形式存储的Numeric key型的字典
  • 以 complex_key_hashed形式存储的Composite keyKey类型的字典

vim tmysql_dictionary.xml

  1. <dictionaries>
  2. <dictionary>
  3. <name>dicts</name>
  4. <source>
  5. <mysql>
  6. <replica>
  7. <host>116.255.199.xx</host>
  8. <priority>1</priority>
  9. </replica>
  10. <port>3306</port>
  11. <user>db_benchmark</user>
  12. <password>password</password>
  13. <db>db_benchmark</db>
  14. <table>test_dict</table>
  15. <where>status=1</where>
  16. <invalidate_query>select count(*) from test_dict where status=1</invalidate_query>
  17. </mysql>
  18. </source>
  19. <lifetime>
  20. <min>300</min>
  21. <max>360</max>
  22. </lifetime>
  23. <layout>
  24. <flat/>
  25. </layout>
  26. <structure>
  27. <id>
  28. <name>id</name>
  29. </id>
  30. <attribute>
  31. <name>code</name>
  32. <type>String</type>
  33. <null_value></null_value>
  34. </attribute>
  35. <attribute>
  36. <name>name</name>
  37. <type>String</type>
  38. <null_value></null_value>
  39. </attribute>
  40. </structure>
  41. </dictionary>
  42. <dictionary>
  43. <name>mydicts</name>
  44. <source>
  45. <mysql>
  46. <replica>
  47. <host>116.255.199.xx</host>
  48. <priority>1</priority>
  49. </replica>
  50. <port>3306</port>
  51. <user>db_benchmark</user>
  52. <password>password</password>
  53. <db>db_benchmark</db>
  54. <table>test_complex_key_dict</table>
  55. <where></where>
  56. <invalidate_query>select count(*) from test_complex_key_dict</invalidate_query>
  57. </mysql>
  58. </source>
  59. <lifetime>
  60. <min>100</min>
  61. <max>160</max>
  62. </lifetime>
  63. <layout>
  64. <complex_key_hashed />
  65. </layout>
  66. <structure>
  67. <key>
  68. <attribute>
  69. <name>code</name>
  70. <type>String</type>
  71. </attribute>
  72. </key>
  73. <attribute>
  74. <name>value</name>
  75. <type>String</type>
  76. <null_value>??</null_value>
  77. </attribute>
  78. </structure>
  79. </dictionary>
  80. </dictionaries>