ClickHouse进阶(十二):Clickhouse数据字典-2-字典类型

news2024/11/19 3:36:48

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_大数据OLAP体系技术栈,Apache Doris,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!

 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频


目录

1. flat

 2. hashed

​​​​​​​3. range_hashed

4. cache

5. complex_key_hashed

6. complex_key_cache

7. ip_trie


在创建字典表语句中使用“layout”来指定字典的类型,目前扩展字典支持7种类型,分别为flat、hashed、range_hashed、cache、complex_key_hashed、complex_key_cache、ip_trie,不同的字典类型决定了数据在内存中以何种结构组织和存储。

扩展字典根据使用时传入的条件不同,可以划分为两类:

  • 支持单个数值型条件(条件类型必须是UInt64)

flat、hashed、range_hashed、cache

  • 支持复合条件

complex_key_hashed、complex_key_cache、ip_trie

下面分别介绍以上不同字典类型配置使用。

1. flat

flat字典是所有类型中性能最高的字典类型,只能使用UInt64数值型key。flat字典在内存中使用数组结构保存,默认最多保存50万行数据,如果在创建字典时数据量超出上限,则创建失败。

flat数据字典使用如下:

#创建flat数据字典

CREATE DICTIONARY flat_dic_test(

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



#使用flat字典表

select dictGet('dic_test_db.flat_dic_test','local_name',toUInt64(100)) as local_name;



┌─local_name─┐

│ 北京       │

└────────────┘

 2. hashed

hashed字典同样只能够使用UInt64数值型key,与flat不同的是hashed字典在内存中通过散列结构保存,没有存储上限,案例参照后续部分。

​​​​​​​3. range_hashed

range_hashed字典可以看做hashed字典的变种,在原有功能的基础上增加了指定时间区间的特性,数据会以散列结构存储并按照时间排序。时间区间通过range_min和range_max元素指定,创建range_hashed字典表时必须指定Range时间范围且起始结束字段必须是Date或者DateTime类型。

range_hashed字典表使用案例如下:

#创建普通表 rate表,表中四列代表:用户、开始时间、结束时间、优惠金额

create table rate(id UInt64, start Date, end Date, discount Float32) ENGINE=MergeTree() order by id;



#向表rate中插入如下数据

insert into rate values (111, '2021-11-01', '2021-11-03', 100),(111, '2021-11-04', '2021-11-20', 200),(222, '2021-11-10', '2021-11-12',300);

#创建range_hashed字典表

CREATE DICTIONARY hash_range_dic_test (

    id UInt64,

    start Date,

    end Date,

    discount Float32

)

PRIMARY KEY id

SOURCE(clickhouse(

    host 'node1'

    port 9000

    user 'default'

    db 'dic_test_db'

    password ''

    table 'rate'

))

LAYOUT(RANGE_HASHED())

RANGE(MIN start MAX end)

LIFETIME(30);



#使用range_dic查询数据

select dictGetFloat32('dic_test_db.hash_range_dic_test', 'discount', toUInt64(111), toDate('2021-11-02')) as discount;

┌─discount─┐

│      100 │

└──────────┘



select dictGetFloat32('dic_test_db.hash_range_dic_test', 'discount', toUInt64(111), toDate('2021-11-19')) as discount;

┌─discount─┐

│      200 │

└──────────┘



select dictGetFloat32('dic_test_db.hash_range_dic_test', 'discount', toUInt64(222), toDate('2021-11-20')) AS discount;

┌─discount─┐

│        0 │

└──────────┘

注意:以上我们查询对应数据时,需要多传入一个时间参数,dictGet函数会根据数据找到传入条件所属范围,找到对应的值返回。

4. cache

cache字典只能够使用UInt64数值类型的key,该字典数据在内存中通过固定长度的向量数组保存,定长的向量数组又称cells,在创建cache字典表时需要指定向量数组长度,长度必须是2的整数倍,若不是,会自动向上取2的整数倍的整数。

cache字典用于一些数据不适合长期存放在内存,但是频繁访问的数据需要放在内存的场景。cache字典的取数并不是一次性将所有数据加载到内存中,当从cache字典中获取数据时,首先在cells中查询有没有该数据缓存,没有就会从源头加载数据并缓存到cells中,所以cache性能最不稳定,性能好坏完全取决于缓存的命中率,建议少使用此类型字典。

cache字典表使用案例如下:

#创建cache数据字典

CREATE DICTIONARY cache_dic_test(

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(CACHE(SIZE_IN_CELLS 100000));



#使用cache字典表

select dictGet('dic_test_db.cache_dic_test','local_name',toUInt64(100)) as local_name;

┌─local_name─┐

│ 北京       │

└────────────┘

5. complex_key_hashed

complex_key_hashed字典在功能方面与hashed字典完全相同,只是将当个数值型key替换成了复合型。

complex_key_hashed使用案例如下:

#创建普通表 student_info

create table student_info(

id UInt64,

code String,

name String,

age UInt8

)engine=MergeTree()

order by id;



#向表student_info中插入数据

insert into student_info values (1,'001','张三',18),(2,'002','李四',19),(3,'003','王五',20);



#创建complex_key_hashed 字典表

CREATE DICTIONARY complex_key_hashed_dic_test

(

    id UInt64,

    code String,

    name String,

    age UInt8

)

PRIMARY KEY id,code

SOURCE(clickhouse(

    host 'node1'

    port 9000

    user 'default'

    db 'dic_test_db'

    password ''

    table 'student_info'

))

LAYOUT(COMPLEX_KEY_HASHED())

LIFETIME(30);



#使用complex_key_hashed字典表查询数据

SELECT dictGet('dic_test_db.complex_key_hashed_dic_test', 'name', tuple(toUInt64(2), '002')) AS name;

┌─name─┐

│ 李四 │

└──────┘

注意:使用complex_key_hashed字典表时传入条件key时,格式为tuple,tuple中到底传入几个参数,需要与创建该字典时指定的primary key顺序一样。

6. complex_key_cache

complex_key_cache字典同样与cache字典的特性完全相同,只是将单个数值型key替换成了复合型。

complex_key_cache使用案例如下:

#创建complex_key_cache字典表

CREATE DICTIONARY complex_key_cache_dic_test

(

    id UInt64,

    code String,

    name String,

    age UInt8

)

PRIMARY KEY id,age

SOURCE(clickhouse(

    host 'node1'

    port 9000

    user 'default'

    db 'dic_test_db'

    password ''

    table 'student_info'

))

LAYOUT(COMPLEX_KEY_CACHE(SIZE_IN_CELLS 100000))

LIFETIME(30);



#使用complex_key_cache字典表查询

SELECT dictGet('dic_test_db.complex_key_cache_dic_test', 'name', tuple(toUInt64(3), 20)) AS name;

┌─name─┐

│ 王五 │

└──────┘

7. ip_trie

ip_trie为复合型key的字典,但是比较特殊,因为在查询时只能在tuple中指定单个字段,用于指代IP前缀,ip_trie字典的数据在内存中使用trie树结构保存,此字典专门用于IP前缀查询的场景,例如通过IP前缀查询对应的ASN信息。

扩展:ASN(Autonomous System Number)是为每个大型网络分配的编号,该编号全球唯一。通过查询IP地址隶属的ASN编号,可以了解该IP地址隶属的网络运营商,以及大致的地址位置。

ip_trie字典表使用案例如下:

#创建IP信息表

create table ip_info(prefix String, asn UInt32, ccode String) ENGINE=TinyLog;



#向表ip_info中插入数据

insert into ip_info values

('192.168.179.1',11223,'NP')

('192.168.179.2',11224,'US')

('192.168.179.3',11225,'RU')

('192.168.179.4',11226,'CN')

;



#创建ip_tire字典表

CREATE DICTIONARY ip_tire_dict_test (

    prefix String,

    asn UInt32,

    ccode String

)

PRIMARY KEY prefix

SOURCE(clickhouse(

    host 'node1'

    port 9000

    user 'default'

    db 'dic_test_db'

    password ''

    table 'ip_info'

))

LAYOUT(IP_TRIE())

LIFETIME(30);



#使用ip_tire字典表查询数据

select dictGetUInt32('dic_test_db.ip_tire_dict_test', 'asn', tuple(IPv4StringToNum('192.168.179.3'))) as asn,dictGet('dic_test_db.ip_tire_dict_test', 'ccode', tuple(IPv4StringToNum('192.168.179.3'))) as ccode;



┌───asn─┬─ccode─┐

│ 11225 │ RU    │

└───────┴───────┘

 👨‍💻如需博文中的资料请私信博主。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1001300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

buuctf crypto 【[GXYCTF2019]CheckIn】解题记录

1.打开文件,发现密文 2.一眼base64,解密一下 3.解密后的字符串没有什么规律,看了看大佬的wp,是rot47加密,解密一下(ROT5、ROT13、ROT18、ROT47位移编码)

第一章 计算机系统概述 五、中断和异常、系统调用

目录 一、中断的作用 二、中断的类型 1、内中断(异常) 2、外中断 三、中断机制的基本原理 四、系统调用 1、定义: 2、与库函数的区别 3、按功能分类 4、作用 一、中断的作用 1、“中断”是让操作系统内核夺回CPU使用权的唯一途径 …

防火墙防火墙

什么是防火墙 防火墙是一种网络安全设备或软件,用于监控和控制网络流量,以保护网络免受未经授权的访问、恶意攻击和数据泄露等威胁。 防火墙的作用 1. 访问控制:防火墙可以根据规则和策略,限制和过滤网络流量,只允许经…

Python基础教程:序列排序

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说,直接开搞,如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 正文 python中,一般在涉及到列表排序时,都用内置的sort()方法或者全局的sorted()方法&#xff0c…

想要精通算法和SQL的成长之路 - 相交链表

想要精通算法和SQL的成长之路 - 相交链表 前言一. 相交链表(双指针) 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 相交链表(双指针) 原题链接 思路如下: 1.我们假设 headA链表的长度为 a。headB链表的长度为b…

算法通关村18关 | 回溯模板如何解决分割回文串问题

1. 分割回文串 题目 LeetCode131 分割回文串,给你一个字符串s,请你将s分割成一些字串,使每个字串都是回文串,返回s所有可能的分割方案。 回文串是正着和反着读都是一样的字符串。 思路 知道回溯的模板,用回溯的角度思…

Ceph入门到精通-ceph对于长文件名如何处理

RADOS object with short name 上一篇博文,我们将介绍了对象相关的数据结构ghobject_t,以及对象在底层文件系统存储的文件名,以及如何从文件名对应到 ghobject_t对象。 映射关系如下图所示: 这里面有一个漏洞,即obje…

云服务器与内网穿透有什么区别?哪个好用?

云服务器与内网穿透有什么区别,哪个好用?如何在自己公网IP云主机上部署搭建P2P穿透?这里给大家汇总介绍一下,供大家共同学习了解。 云服务器的一些特点: 需要数据上云场景时,通常可以选择使用云服务器。 …

JavaScript的内置类

一、认识包装类型 1.原始类型的包装类 JavaScript的原始类型并非对象类型,所以从理论上来说,它们是没有办法获取属性或者调用方法的。 但是,在开发中会看到,我们会经常这样操作: var message "hello world&q…

Android:viewPage+Fragment实现模拟微信首页

一、前言&#xff1a;虽然现在很多已经不这么写了&#xff0c;但是这是最底层的东西&#xff0c;我想我还是要好好理解一下的。这篇代码是模拟微信首页底部按钮和ViewPage的联动。记录一下&#xff01;&#xff01; 二、代码理解&#xff1a; 主页面布局 <?xml version&…

积木报表 JimuReport v1.6.2-GA版本发布—高危SQL漏洞安全加固版本

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR显示CPU过载,该如何解决?

视频云存储/安防监控/视频汇聚平台EasyCVR基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频监控系统EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云…

主品牌老化:企业增长面临的关键挑战——《主品牌进化战略》节选

在今天&#xff0c;大部分行业的竞争环境已经从匀速变化迭代为加速变化&#xff0c;主品牌老化成为企业增长面临的重要挑战&#xff0c;这一点已经变得非常明显。技术革新、产业革命以及顾客需求的演变势不可挡&#xff0c;跨周期竞争已经成为常态。在这种情况下&#xff0c;企…

React 展开运算符

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库溯源相关 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 展开运算符 1. 展开数组 <script type"text/javascript">let arr1 [1,3,5,7,9]let arr2 [2,4,6,8,10]console.log(...arr1)&l…

OSPF协议LSDB同步过程和邻居状态机

【微|信|公|众|号&#xff1a;厦门微思网络】 华为HCIA试听课程&#xff1a;网络工程师的基本功&#xff1a;网络地址转换NAT https://mp.weixin.qq.com/s/jJRRSj3EdjFHrXCAqRCVeg 华为HCIP试听课程&#xff1a;华为HCIP必考题&#xff1a;DHCP协议原理与配置https://mp.weixi…

ICC2: ICG clone与ICG merge

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 默认情况下,initial_place阶段或者在spg flow的initial_opt阶段工具会自动merge clock gating cell。但是如果在place_opt之前使用merge_clock_gates命令了,place阶段就不会再merge clock gate了。…

Linux中断底半部机制总结

linux实现底半部的机制主要有tasklet、workqueue、softirq。 1.tasklet tasklet的使用较为简单&#xff0c;它的执行上下文是软中断&#xff0c;所以在tasklet中不能睡眠&#xff0c;它的执行时机通常是中断顶半部返回的时候。我们只需要定义tasklet及其处理函数&#xff0c;…

【管理运筹学】第 7 章 | 图与网络分析(4,最大流问题)

系列文章目录 【管理运筹学】第 7 章 | 图与网络分析&#xff08;1&#xff0c;图论背景以及基本概念、术语、矩阵表示&#xff09; 【管理运筹学】第 7 章 | 图与网络分析&#xff08;2&#xff0c;最小支撑树问题&#xff09; 【管理运筹学】第 7 章 | 图与网络分析&#xf…

健身小程序制作流程详解

随着移动互联网的普及&#xff0c;越来越多的人开始关注健康和健身。为了满足这一需求&#xff0c;制作一款健身小程序已经成为一种趋势。本文将详细介绍如何使用第三方制作平台&#xff0c;如乔拓云网&#xff0c;制作健身小程序&#xff0c;让你轻松成为专家。 一、注册与登录…

CG MAGIC分享3ds Max卡顿未保存处理方法有哪些?

3ds Max进行建模、渲染这一系列过程中&#xff0c;大家使用中都会遇到各种原因导致软件卡顿或崩溃是很常见的情况。 可以说卡机没关系&#xff0c;可是卡顿发生时&#xff0c;如果之前的工作没有及时保存&#xff0c;可能会导致数据的丢失和时间的浪费。这就是最让人烦躁的了&…