clickhouse-介绍、安装、数据类型、sql

1、介绍

ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。

OLAP(On-Line Analytical Processing)翻译为联机分析处理,专注于分析处理,从对数据库操作来看,OLAP是对数据的查询;
OLTP(on-line transaction processing)翻译为联机事务处理,专注于事务处理,从对数据库操作来看,OLTP主要是对数据的增删改。

1.1、特点:列式存储

以下面的表为例:

1)采用行式存储时,数据在磁盘上的组织结构为

好处是想查某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。

2)采用列式存储时,数据在磁盘上的组织结构为

这时想查所有人的年龄只需把年龄那一列拿出来就可以了。

3)列式存储的好处:

对于列的聚合、计数、求和等统计操作原因优于行式存储;
由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重;
由于数据压缩比更好,一方面节省了磁盘空间,另一方面对于cache也有了更大的发挥空间
DBMS的功能:几乎覆盖了标准SQL的大部分语法,包括DDL和DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复;

1.2、多样化引擎

ClickHouse和MySQL类似,把表级的存储引擎插件化,根据表的不同需求可以设定不同的存储引擎。目前包括合并树、日志、接口和其他四大类20多种引擎;

1.3、高吞吐写入能力

ClickHouse采用类LSM Tree的结构,数据写入后定期在后台Compaction。通过类LSM tree的结构,ClickHouse在数据导入时全部是顺序append写,写入后数据段不可更改,在后台compaction时也是多个段merge sort后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力,即便在HDD上也有着优异的写入性能。

官方公开benchmark测试显示能够达到50MB-200MB/s的写入吞吐能力,按照每行100Byte估算,大约相当于50W-200W条/s的写入速度

1.4、数据分区与线程级并行

ClickHouse将数据划分为多个partition,每个partition再进一步划分为多个index granularity(索引粒度),然后通过多个CPU核心分别处理其中的一部分来实现并行数据处理。在这种设计下,单条Query就能利用整机所有CPU。极致的并行处理能力,极大的降低了查询延时

所以,ClickHouse即使对于大量数据的查询也能够化整为零平行处理。但是有一个弊端就是对于单条查询使用多cpu,就不利于同时并发多条查询。所以对于高qps的查询业务,ClickHouse并不是强项

2、安装

2.1、准备工作

确定防火墙处于关闭状态

CentOS取消打开文件数限制

sudo vim /etc/security/limits.conf

在末尾加入:

* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072

第一列是限制的用户和用户组,soft软限制,hard硬限制,nofile打开文件数,nproc用户进程数,退出当前用户,重启登录,ulimit -a查看打开文件数和用户进程数是否更改

[root@aliyun ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7284
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 131072
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

2.2、安装依赖

sudo yum install -y libtool
sudo yum install -y *unixODBC*

CentOS取消SELINUX(不知道为什么我修改后,就没网了) vim /etc/selinux/config 修改为:SELINUX=disabled 修改完重启服务器

单机安装,下载安装包,安装包下载,需要以下四个rpm包:

clickhouse-client-21.7.3.14-2.noarch.rpm
clickhouse-common-static-21.7.3.14-2.x86_64.rpm
clickhouse-common-static-dbg-21.7.3.14-2.x86_64.rpm
clickhouse-server-21.7.3.14-2.noarch.rpm

mac下要下载arm的,注意!!!

wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-client-21.7.3.14-2.noarch.rpm
wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-21.7.3.14-2.x86_64.rpm
wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-dbg-21.7.3.14-2.x86_64.rpm
wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-server-21.7.3.14-2.noarch.rpm

2.3、修改配置文件

cd /etc/clickhouse-server/
sudo chmod 777 config.xml?
sudo vim config.xml?

把<listen_host>0.0.0.0</listen_host>的注释打开,这样的话才能让ClickHouse被除本机之外的服务器访问。

这个配置文件中,ClickHouse一些默认路径配置:

数据文件路径: /var/lib/clickhouse/
日志文件路径:/var/log/clickhouse-server/clickhouse-server.log
启动Server

sudo systemctl start clickhouse-server
或者
sudo clickhouse start

查看启动状态:

sudo systemctl status clickhouse-server
或者
sudo clickhouse status

关闭开启自启

sudo systemctl disable clickhouse-server

2.4、使用client连接server

clickhouse-client -m

在连接的过程中出现了两个错误:错误一:

Code: 210. DB::NetException: Connection 
refused (localhost:9000). (NETWORK_ERROR)

如果在配置文件中有<listen_host>::</listen_host>,就改成<listen_host>0.0.0.0</listen_host>,因为::是IPv6的通配符,我部署clickhouse的机器不支持ipv6。

错误二:

Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED)
在命令中带上–password:clickhouse-client -m --password

3、数据类型

3.1、整形

固定长度的整型,包括有符号整型或无符号整型:Int8、Int16、Int32、Int64

3.2、浮点数

Float32、Float64

浮点数计算精度缺失问题:select 1.0-0.9

┌──────minus(1., 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘

3.3、布尔型

没有单独的类型来存储布尔值。可以使用UInt8类型,取值限制为0或1。

Decimal型

Decimal32(s)相当于Decimal(9-s,s)

Decimal64(s)相当于Decimal(18-s,s)

Decimal128(s)相当于Decimal(38-s,s)

3.4、字符串

String:字符串可以任意长度的。它可以包含任意的字节集,包含空字节;
FixedString(N):固定长度N的字符串,N必须是严格的正自然数。当服务端读取长度小于N的字符串时候,通过在字符串末尾添加空字节来达到N字节长度。当服务端读取长度大于N的字符串时候,将返回错误消息。

3.5、枚举类型

包括Enum8和Enum16类型。Enum保存**’string’=integer**的对应关系

Enum8用’string’=Int8来描述
Enum16用’string’=Int16来描述
创建一个带有一个枚举Enum8(‘hello’ = 1, ‘world’ = 2)类型的列:

create table t_enum(
x Enum8('hello' = 1,'world' = 2)
)engine = TinyLog;

这个x列只能存储类型定义中列出的值:‘hello’或’world’:

inser tinto t_enum values ('hello'),('hello'),('world'),('world');

如果尝试保存任何其他值,ClickHouse抛出异常:

insert into t_enum values('a');

如果需要看到对应行的数值,则必须将Enum值转换为整数类型:

select cast(x,'Int8') from t_enum;

3.6、时间类型

目前ClickHouse有三种时间类型:

Date接受年-月-日的字符串,比如:2019-12-16;
Datetime接受年-月-日 时:分:秒的字符串,比如2019-12-16 20:50:10;
Datetime64 接受年-月-日 时:分:秒.亚秒的字符串,比如2019-12-16 20:50:10.66。
日期类型用两个字节存储,表示从1970-01-01到当前的日期值

3.7、数组

Array(T):由T类型元素组成的数组,T可以是任意类型,包含数组类型。但不推荐使用多维数组,ClickHouse对多维数组的支持有限。例如,不能在MergeTree表中存储多维数组,创建数组方式:使用array函数

select array(1, 2) as x, toTypeName(x);

使用方括号

select [1, 2] as x, toTypeName(x);

4、SQL操作

Insert
基本与标准SQL(MySQL)基本一致:

标准:

insert into [table_name] values(…),(…)

从表中插入表:

insert into [table_name] select a,b,c from [table_name_2]

Update和Delete

ClickHouse提供了Delete和Update的能力,这类操作被称为Mutation查询,它可以看做Alter的一种。虽然可以实现修改和删除,但是和一般的OLTP数据库不一样,Mutation语句是一种很重的操作,而且不支持事务。

重的原因主要是每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区,所以尽量做批量的变更,不要进行频繁小数据的操作。

删除操作:

alter table t_order_smt delete where sku_id ='sku_001';

修改操作:

alter table t_order_smt update total_amount=toDecimal32(2000.00,2) 
where id=102;

由于操作比较重,所以Mutation语句分两步执行,同步执行的部分其实只是进行新增数据、新增分区和并把旧分区打上逻辑上的失效标记。直到触发分区合并的时候,才会删除旧数据释放磁盘空间,一般不会开放这样的功能给用户,由管理员完成。

查询操作
ClickHouse基本上与标准SQL差别不大:

支持子查询;
支持CTE(Common Table Expression公用表表达式with子句);
支持各种JOIN,但是JOIN操作无法使用缓存,所以即使是两次相同的JOIN语句,ClickHouse也会视为两条新SQL;
不支持自定义函数;
GROUP BY操作增加了with rollup、with cube、with total用来计算小计和总计。
测试下GROUP BY的三种操作,看下数据:

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 101 │ sku_001 │         1000 │ 2020-06-01 12:00:00 │
│ 101 │ sku_001 │         1000 │ 2020-06-01 12:00:00 │
│ 102 │ sku_002 │         2000 │ 2020-06-01 11:00:00 │
│ 102 │ sku_002 │         2000 │ 2020-06-01 13:00:00 │
│ 102 │ sku_002 │        12000 │ 2020-06-01 13:00:00 │
│ 102 │ sku_002 │         2000 │ 2020-06-01 11:00:00 │
│ 102 │ sku_002 │         2000 │ 2020-06-01 13:00:00 │
│ 102 │ sku_002 │        12000 │ 2020-06-01 13:00:00 │
│ 102 │ sku_004 │         2500 │ 2020-06-01 12:00:00 │
│ 102 │ sku_004 │         2500 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 102 │ sku_002 │          600 │ 2020-06-02 12:00:00 │
│ 102 │ sku_002 │          600 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

with rollup:从右至左去掉维度进行小计

select id,sku_id,sum(total_amount) from t_order_mt 
group by id,sku_id with rollup;

with cube : 从右至左去掉维度进行小计,再从左至右去掉维度进行小计

select id,sku_id,sum(total_amount) from t_order_mt 
group by id,sku_id with cube;

with totals: 只计算合计

select id,sku_id,sum(total_amount) from t_order_mt 
group by id,sku_id with totals;

alter操作,同MySQL的修改字段基本一致。

1)新增字段:alter table tableName add column newcolname String after col1;
2)修改字段类型:alter table tableName modify column newcolname String;
3)删除字段:alter table tableName drop column newcolname;

导出数据

clickhouse-client --query "select * from 
t_order_mt where create_time='2022-08-28 12:00:00'" 
--format CSVWithNames> /opt/module/data/rs1.csv

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注&#xff1a; 第一个是活动窗口&#xff0c;即缩放当前窗口 第二个是所有编辑器窗口&#xff0c;即缩放所有窗口的字体 2、插件 汉化包&#xff1a; Chinese Simplified 包

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手&#xff0c;还是希望更新知识体系的专业人士&#xff0c;只要按照本…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入&#xff1a;小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛&#xff1a;“美食图像识别”。参赛者需要训练计算机&#xff0c;看一张食物照片&#xff08;例如披萨、苹果、汉堡等&#xff09;&#xff0c;就能猜出这是什么食物。听起来…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…

[C++]使用纯opencv部署yolov12目标检测onnx模型

yolov12官方框架&#xff1a;sunsmarterjie/yolov12 【算法介绍】 在C中使用纯OpenCV部署YOLOv12进行目标检测是一项具有挑战性的任务&#xff0c;因为YOLOv12通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff…

神经网络八股(3)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小&#xff0c;最终趋近于零&#xff0c;这会导致靠前层的神经网络层权重参数更新缓慢&#xff0c;甚至不更新&#xff0c;学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大&#xff0c;…

zyNo.26

[GXYCTF2019]Ping Ping Ping&#xff08;Web&#xff09; 传/&#xff1f;ip1有ping回显&#xff0c;说明后端可能通过php参数接受了ip参数&#xff0c;并且拼接到了最终执行的命令里形成了ping -c 3$ip&#xff0c;这样可能存在一个命令注入漏洞 要判断是否符合 ping -c 3$ip …

轻量级SDK,大能量:EasyRTC重塑嵌入式设备音视频体验

在智能硬件与物联网迅猛发展的今天&#xff0c;嵌入式设备的音视频通讯能力正变得愈加关键。然而&#xff0c;受限于硬件资源&#xff0c;尤其是Flash存储空间的不足&#xff0c;传统的音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架…

算法日常刷题笔记(2)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第二篇笔记 笔记时间为2月17日到2月23日 第一天 找到初始输入字符串 找到初始输入字符串 Ihttps://leetcode.cn/problems/find-the-original-typed-string-i/ Alice 正在她的电脑上输入一个字符串。但是她打字技…

[实现Rpc] 客户端 | Requestor | RpcCaller的设计实现

目录 Requestor类的实现 框架 完善 onResponse处理回复 完整代码 RpcCaller类的实现 1. 同步调用 call 2. 异步调用 call 3. 回调调用 call Requestor类的实现 &#xff08;1&#xff09;主要功能&#xff1a; 客户端发送请求的功能&#xff0c;进行请求描述对服务器…

WPS计算机二级•文档的页面设置与打印

听说这是目录哦 纸张大小页边距和装订线❤️‍&#x1f525;打印界面讲解❤️缩印&#x1f495;打印作文稿纸&#x1f49e;将文档打印成书籍&#x1f493;限制编辑设置&#x1f497;给文字文档加密&#x1f496;文档导出为 PDF格式&#x1f498;协作编辑模式&#x1f49d;能量站…

hackmyvm-buster

题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…

将Ubuntu操作系统的安装源设置为阿里云

在使用Ubuntu操作系统时,默认的软件源通常是国外的仓库,这可能会导致软件安装和更新速度较慢。为了提高下载速度和稳定性,我们可以将Ubuntu的安装源设置为阿里云镜像源。以下是详细步骤: 一、准备工作 在开始之前,请确保您的Ubuntu系统可以正常上网,并且您拥有管理员权…

基于 Python 的项目管理系统开发

基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中&#xff0c;有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统&#xff0c;能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…

LabVIEW C编译支持工具库CCompileSupp.llb

路径&#xff1a;C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\CCompileSupp.llb ​ 1. 工具库概述 定位&#xff1a;LabVIEW内置的C语言编译支持工具库&#xff0c;用于处理LabVIEW与C/C代码的混合编程接口&#xff0c;涵盖编译器配置、代码生成…

JVM之JVM的组成

Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序的运行核心&#xff0c;它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。 类加载系统&#xff08;Class Loading System&#xff09; 类加载系统负责在程序运行时动态地将 Java 类加载到 J…

pycharm 调试 debug 进入 remote_sources

解决办法1&#xff1a; pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"&#xff08;此时文件夹会变为蓝色&#xff09;。 解决方法2 Debug:使用Pychar…

iOS App的启动与优化

App的启动流程 App启动分为冷启动和热启动 冷启动&#xff1a;从0开始启动App热启动&#xff1a;App已经在内存中&#xff0c;但是后台还挂着&#xff0c;再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段&#xff1a; dyld&#xff1a…

StarRocks FE leader节点CPU使用率周期性的忽高忽低问题分析

背景 本文基于 StarRocks 3.3.5 最近在做一些 StarRocks 相关的指标监控的时候&#xff0c;看到了FE master的CPU使用率相对其他FE节点是比较高的&#xff0c;且 呈现周期性的变化&#xff08;周期为8分钟&#xff09;&#xff0c; 于此同时FE master节点的GC频率相对于其他节…