热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于clickhouse入门

关于clickhouse入门先来个基本介绍一.速度快二.功能多三.文艺范clickhouse基本使用clickhouse建表基本分区与主键索引类型minmaxset(max_row


关于clickhouse入门

  • 先来个基本介绍
    • 一. 速度快
    • 二. 功能多
    • 三. 文艺范
  • clickhouse基本使用
    • clickhouse建表
    • 基本分区与主键
    • 索引类型
      • minmax
      • set(max_rows)
      • ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)
      • tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)
      • bloom_filter(bloom_filter([false_positive]) – 为指定的列存储布隆过滤器
      • 注意
    • 实际使用
      • 1、clickhouse建表
    • 数据导入
      • java直接连接
      • mongo关联
      • mysql关联
      • 消息中间件
    • 关于连接安全
    • 函数
      • Retention
  • 结语


先来个基本介绍

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。由号称“俄罗斯 Google”的Yandex开发而来,在2016年开源,在计算引擎里算是一个后起之秀,在内存数据库领域号称是最快的。由于它有几倍于GreenPlum等引擎的性能优势,所以不少人都选择将其安装云服务器中使用。

ClickHouse是一个列导向数据库,是原生的向量化执行引擎。它在大数据领域没有走Hadoop生态,而是采用Local attached storage作为存储,这样整个IO可能就没有Hadoop那一套的局限。它的系统在生产环境中可以应用到比较大的规模,因为它的线性扩展能力和可靠性保障能够原生支持shard+replication这种解决方案。它还提供了一些SQL直接接口,有比较丰富的原生client。

以下是ClickHouse作为分析型数据库的特点:


一. 速度快

ClickHouse性能超过了市面上大部分的列式存储数据库,相比传统的数据ClickHouse要快100-1000倍,ClickHouse还是有非常大的优势。

100Million 数据集:

ClickHouse比Vertica约快5倍,比Hive快279倍,比MySQL快801倍

1Billion 数据集:

ClickHouse比Vertica约快5倍,MySQL和Hive已经无法完成任务了。


二. 功能多

ClickHouse支持数据统计分析各种场景:

1.支持类SQL查询;

2.支持繁多库函数(例如IP转化,URL分析等,预估计算/HyperLoglog等);

3.支持数组(Array)和嵌套数据结构(Nested Data Structure);

4.支持数据库异地复制部署。


三. 文艺范

不理睬Hadoop生态,走自己的路。目前任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行。

而ClickHouse的缺点:

1.不支持Transaction:想快就别想Transaction;

2.聚合结果必须小于一台机器的内存大小:不是大问题;

3.缺少完整的Update/Delete操作;

4.支持有限操作系统。


clickhouse基本使用


clickhouse建表

https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/versionedcollapsingmergetree/#versionedcollapsingmergetree


基本分区与主键

https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/mergetree/


索引类型


minmax

官方定义:
存储指定表达式的极值(如果表达式是 tuple ,则存储 tuple 中每个元素的极值),这些信息用于跳过数据块,类似主键。
推荐:使用当日排行榜,前三名等场景使用;


set(max_rows)

官方定义:
存储指定表达式的不重复值(不超过 max_rows 个,max_rows=0 则表示『无限制』)。这些信息可用于检查 数据块是否满足 WHERE 条件。
推荐:基本分类,如业务中使用的buttonCode;behavior等使用,限制数需主动把控;


ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)

官方定义:存储一个包含数据块中所有 n元短语(ngram) 的 布隆过滤器 。只可用在字符串上。
可用于优化 equals , like 和 in 表达式的性能。
n – 短语长度。
size_of_bloom_filter_in_bytes – 布隆过滤器大小,单位字节。(因为压缩得好,可以指定比较大的值,如 256 或 512)。
number_of_hash_functions – 布隆过滤器中使用的哈希函数的个数。
random_seed – 哈希函数的随机种子。
推荐:如敏感词过滤,类似于代码中常用布隆过滤器场景。


tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)

官方定义:跟 ngrambf_v1 类似,不同于 ngrams 存储字符串指定长度的所有片段。它只存储被非字母数字字符分割的片段。
推荐: 如ip4段需使用ip三段做分组


bloom_filter(bloom_filter([false_positive]) – 为指定的列存储布隆过滤器

官方定义:可选的参数 false_positive 用来指定从布隆过滤器收到错误响应的几率。取值范围是 (0,1),默认值:0.025

支持的数据类型:Int*, UInt*, Float*, Enum, Date, DateTime, String, FixedString, Array, LowCardinality, Nullable。

以下函数会用到这个索引: equals, notEquals, in, notIn, has
推荐:带错误几率的布隆过滤器,即可以使用不错错误率,增加速率。
比ngrambf_v1少了几个参数,更像原始布隆过滤器


注意

索引的函数支持在官网标注很清楚;与mysql不完全相同


实际使用


1、clickhouse建表

建表需明确PARTITION (分区)

PRIMARY KEY (主键),clickhouse支持复合主键,但是此时只有排序功能,如果是独立主键,clickhouse支持新增覆盖主键,更新数据功能。

ORDER BY (排序)可类似简单索引使用,mongodb中的索引就是用排序来建立的。order by只能减少,不能新增。即建表时已固定。如果使用主键,
主键必须在order by 第一位;order by 的列必须非空。

TTL expr [DELETE|TO DISK ‘aaa’|TO VOLUME ‘bbb’], …
clickhouse支持数据超时设计,但是目前没有想到合适场景。


数据导入


java直接连接

mybatis 已经支持clickhouse,且mybatis -plus(代码生成器不支持),已支持clickhouse;但是事务区别注定原其他db不同。需自行梳理。


mongo关联

clickhouse支持直接查询mongo数据库


mysql关联

当时看到有文档clickhouse 直接读取bin-log ,但是现在找不到了。个人建议不要直接读取mysql-bin-log。 因为clickhouse 不支持频繁插入,会出现丢数据情况。
clickhouse mysql引擎可以直接关联远程数据库。但是只支持做关联,新增数据,删除数据,修改数据暂时不支持。


消息中间件

kafka,clickhouse有直接的kafka引擎,简单说可以把消息投递到kafka,
然后解析json,定时分发到不同消费者。


关于连接安全

clickhouse的查询可以直接看到 ddl语句。
那么我们建立的mysql连接就是暴露的。
clickhouse官网给出了方案:

$ cat /etc/odbc.ini
[mysqlconn]
DRIVER = /usr/local/lib/libmyodbc5w.so
SERVER = 127.0.0.1
PORT = 3306
DATABASE = test
USERNAME = clickhouse
PASSWORD = clickhouse

CREATE TABLE odbc_t
(`int_id` Int32,`float_nullable` Nullable(Float32)
)
ENGINE = ODBC('DSN=mysqlconn', 'test', 'test')

但是很遗憾,阿里的商业库不支持。


函数

clickhouse提供了丰富的统计函数,先推荐一个,其余慢慢体会。


Retention

retention(cond1, cond2, …, cond32);
直接附案例

select
t1.date "日期",t1.channelCode "渠道",t2.c1 "阅读页UV",t1.c1 "阅读页顶部返回按钮点击",t1.c2 "阅读页顶部关闭按钮点击",t1.c3 "阅读页阅读记录按钮点击",t1.c4 "阅读页返回首页按钮点击",t2.c2 "个人中心页面",t1.c5 "我的顶部退出按钮点击",t2.c3 "书城uv",t1.c6 "书城顶部退出按钮点击"
from
(
select
date ,channelCode,sum(r[2]) c1,sum(r[3]) c2,sum(r[4]) c3,sum(r[5]) c4,sum(r[6]) c5,sum(r[7]) c6
from (select date,channelCode,deviceNo ,retention(1,buttonCode = 'BUTTON_READ_RETURN' , buttonCode = 'BUTTON_READ_QUIT',buttonCode = 'BUTTON_READ_RECORD',buttonCode = 'BUTTON_RETURN_HOME',buttonCode = 'BUTTON_MY_QUIT',buttonCode = 'BUTTON_BOOK_QUIT') rfrom count_button_logwhere date BETWEEN 20201118 and 20201122and buttonCode in ('BUTTON_READ_RETURN','BUTTON_READ_QUIT','BUTTON_READ_RECORD','BUTTON_RETURN_HOME','BUTTON_MY_QUIT','BUTTON_BOOK_QUIT')and behavior = 'click'and channelCode = 'yoc_lwxs_KH-10'
-- and channelCode in ('yoc_lwxs_LWXS-3','yoc_lwxs_SJLR-1NEW','yoc_lwxs_ZY-17','yoc_lwxs_ZY-29','yoc_lwxs_DTYT-5','yoc_lwxs_SJLR-7','yoc_lwxs_KH-10','yoc_lwxs_YL-7','yoc_lwxs_KH-18','yoc_lwxs_KH-6','yoc_lwxs_YL-10NEW')group by date,channelCode,deviceNo)
group by date,channelCode
) t1left join
(
select
date,channelCode,sum(r[2]) c1,sum(r[3]) c2,sum(r[4]) c3
from(select date,channelCode,deviceNo,retention(1,page = '40001' , page = '40005',page = '40003') rfrom count_page_log cpl where page in( '40001','40005','40003')and date BETWEEN 20201118 and 20201122and channelCode = 'yoc_lwxs_KH-10'
-- and channelCode in ('yoc_lwxs_LWXS-3','yoc_lwxs_SJLR-1NEW','yoc_lwxs_ZY-17','yoc_lwxs_ZY-29','yoc_lwxs_DTYT-5','yoc_lwxs_SJLR-7','yoc_lwxs_KH-10','yoc_lwxs_YL-7','yoc_lwxs_KH-18','yoc_lwxs_KH-6','yoc_lwxs_YL-10NEW')group by date,channelCode,deviceNo)
group by date,channelCode
) t2
on t1.date = t2.date and t1.channelCode = t2.channelCode
order by t1.date

比传统全left join 优雅不知道多少倍。
但是其实这个函数更适合做提取包含多个属性的用户。
此处retention(1=1,…)
是为了保证第一位一定返回1,否则!!自己感受~!


结语

clickhouse的查询性能确实比mysql强大。
但是他内存查询,不支持事务的特性注定他只能用于分析统计数据。
这应该是一种趋势,毕竟hbase太庞大了。
最终说一句:都是产品爸爸,运营爸爸逼我们学的。


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有