ClickHouse介绍与应用

1 ClickHouse概述

1.1 简介

ClickHouse由俄罗斯最大的搜索引擎Yandex于2016年6月发布,开发语言为c。 ClickHouse是面向在线分析处理(OLAP )的开源列存储的DBMS。 与简称、Hadoop、Spark等巨无霸的组件相比,ClickHouse更轻

官网:Fast Open-Source OLAP DBMS - ClickHouse

ClickHouse Docs | ClickHouse Docs

下载地址:http://repo.red-soft.biz/repos/clickhouse/stable/el6/

什么是列式存储

以下面的表为例:

Id Name Age
1 张三 18
2 李四 22
3 王五 34

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

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

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

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

1.2 适用场景

1 .日志数据的动作分析

2 .标签图像的分析

3 .数据集市分层

4 .广告系统和实时竞价广告

5 .电子商务和金融业

6 .实时监测和遥感测量

7 .商业智能

8 .网络游戏

9 .信息安全

10 .所有互联网场景

1.3 特性

1 .真正的列数据库

2 .数据压缩

3 .数据的磁盘存储

4 .多核并行处理

5 .多服务器分布式处理(数据存储在不同的shard中,每个shard由一组容错副本组成,可以同时查询所有shard)。

6 .矢量引擎(对列的每一部分进行处理,使CPU高效实用化 )。

7 .实时数据更新(支持表中主键的定义,数据增量有序地存储在mergeTree中)。

8 .索引(按主键对数据进行排序,毫秒内完成数据检索) ) )。

9 .适合在线查询

10 .支持近似计算(允许以精度为代价的低延迟查询) )。

11 .数据复制和数据完整性支持(异步多主复制技术) )。

1. 4 缺陷

1 .没有完整的事务支持

2 .缺乏修改或删除高频率低延迟数据的能力

3 .不适合搜索单行的点查询

4 .网上事务处理

5 .二进制数据或文件存储

6 .键值对数据高效访问请求

1.5 大厂应用

  1. 头条:用户行为分析系统,上报日志 大宽表,减少join,增加map数据类型,展平模型,支持动态scheam
  1. 腾讯:游戏数据分析

  2. 携程:内部从18年7月份开始接入试用,目前80%的业务都跑在ClickHouse上。每天数据增量十多亿,近百万次查询请求

4.快手:内部也在使用ClickHouse,存储总量大约10PB, 每天新增200TB, 90%查询小于3S

5.国外:Yandex内部有数百节点用于做用户点击行为分析,CloudFlare、Spotify等头部公司也在使用

2 ClickHouse架构

1 .表格引擎(Engine ) ) ) )。

表引擎决定数据在文件系统中的存储方式。 常用的也是官方推荐的存储引擎是MergeTree系列。 如果需要复制数据,请使用ReplicatedMergeTree系列。 相当于合并树的复制版本。 要读取集群数据,需要分布式表引擎Distribute。

2 .表分区(分区) )

表中的数据可以按指定的字段分区存储。 每个分区作为目录存在于文件系统中。 通过将典型的时间字段作为分区字段,将数据量大的表按时间分区,将数据量小的表按天或按月分区,在查询时将分区字段作为Where条件使用

3 .瓷砖(Shard ) ) ) ) )。

切片本身是ClickHouse的实例节点。 切片的本质是,为了提高查询的效率,将一个总量的数据分割为多个"切片",从而减少单节点的数据扫描数,提高查询性能。

4 .复制集(复制)

简单地说,是同一数据的备份。 CK通过使用复制集来确保数据的可靠性。 此外,通过使用多个副本,还提高了CK查询的并发性。 这里一般有两种方式。 (1)基于ZooKeeper的表的复制方式; (2)基于集群的复制方式。 我们推荐的数据写入方式是本地表写入,禁止分布式表写入,所以我们的复制表是ZooKeeper的

表复制方案。

5.集群(Cluster)

可以使用多个ClickHouse实例组成一个集群,并统一对外提供服务。

3 ClickHouse部署

3.1 单机部署

1、/etc/security/limits.conf、/etc/security/limits.d/20-nproc.conf文件末尾添加如下内容

复制代码
* soft nofile 65536 
* hard nofile 65536 
* soft nproc 131072 
* hard nproc 131072

重启后验证效果

复制代码
ulimit -n

2、修改/etc/selinux/config中的SELINUX=disabled后重启

3、安装依赖

复制代码
 yum install -y libtool
​
 yum install -y *unixODBC*

4、上传并安装

下载地址:Altinity/clickhouse - Packages · packagecloud

下载相关包

复制代码
clickhouse-client-20.8.3.18-1.el7.x86_64.rpm
clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm
clickhouse-server-20.8.3.18-1.el7.x86_64.rpm
clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm

将文件上传到linux的/usr/local/soft/clickhouse/文件夹下

复制代码
cd /usr/local/soft/clickhouse/
rpm -ivh clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-server-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-client-20.8.3.18-1.el7.x86_64.rpm

顺序最好不要错,否则可能会出错。

5、修改配置文件

cd /etc/clickhouse-server/

/etc/clickhouse-server/config.xml文件中修改数据存放目录和日志目录

复制代码
        <log>/usr/local/soft/clickhouse/clickhouse-server.log</log>
        <errorlog>/usr/local/soft/clickhouse/clickhouse-server.err.log</errorlog>

第114行放开注释,使得远程可访问

<listen_host>::</listen_host>

第62行端口修改为9800,因为9000可能与hadoop冲突

<tcp_port>9800</tcp_port>

/etc/clickhouse-server/users.xml文件中修改用户登录密码

赋予权限:

复制代码
chmod 777 /etc/clickhouse-server/
chmod 777 /usr/local/soft/clickhouse/

默认数据存放位置:/var/lib/clickhouse/data/

5、启动

复制代码
sudo service clickhouse-server start
或
clickhouse-server --config-file=/etc/clickhouse-server/config.xml
或
nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml  >null 2>&1 &
​
关闭
sudo service clickhouse-server stop
查看状态
service clickhouse-server status

6、验证

复制代码
netstat -tnlp
复制代码
clickhouse-client --port 9800

7、DBeaver连接

驱动下载:阿里云盘分享

4 ClickHouse数据类型

4.1 整型

固定长度的整型,包括有符号整型或无符号整型。

整型范围(-2n-1~2n-1-1):

复制代码
Int8 - [-128 : 127]
​
Int16 - [-32768 : 32767]
​
Int32 - [-2147483648 : 2147483647]
​
Int64 - [-9223372036854775808 :9223372036854775807]

无符号整型范围(0~2n-1):

复制代码
UInt8 - [0 : 255]
​
UInt16 - [0 : 65535]
​
UInt32 - [0 : 4294967295]
​
UInt64 - [0 : 18446744073709551615]

4.2 浮点型

Float32 - float

Float64 -- double

建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。

复制代码
:) select 1-0.9
​
┌───────minus(1, 0.9)─┐
​
│ 0.09999999999999998 │
​
└─────────────────────┘

与标准SQL相比,ClickHouse 支持以下类别的浮点数:

Inf-正无穷:

复制代码
:) select 1/0
​
┌─divide(1, 0)─┐
​
│          inf │
​
└──────────────┘

-Inf-负无穷:

复制代码
:) select -1/0
​
┌─divide(1, 0)─┐
​
│          -inf │
​
└──────────────┘

NaN-非数字:

复制代码
:) select 0/0
​
┌─divide(0, 0)─┐
​
│          nan │
​
└──────────────┘

4.3 布尔型

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

4.4 字符串

String

字符串可以任意长度的。它可以包含任意的字节集,包含空字节。

FixedString(N)

固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。

与String相比,极少会使用FixedString,因为使用起来不是很方便。

4.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'。如果尝试保存任何其他值,ClickHouse 抛出异常。

复制代码
:) INSERT INTO t_enumVALUES ('hello'), ('world'), ('hello') 
复制代码
:) insert into t_enumvalues('a')
​
INSERT INTO t_enumVALUES
​
Exception on client:
​
Code: 49.DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)

从表中查询数据时,ClickHouse从 Enum 中输出字符串值。

复制代码
SELECT * FROM t_enum
​
┌─x─────┐
​
│ hello │
​
│ world │
​
│ hello │
​
└───────┘

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

复制代码
SELECT CAST(x, 'Int8')FROM t_enum
┌─CAST(x, 'Int8')─┐
​
│               1 │
​
│               2 │
​
│               1 │
​
└─────────────────┘

4.6 数组

Array(T)**:**由 T 类型元素组成的数组。

T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能在 MergeTree 表中存储多维数组。

可以使用array函数来创建数组:

array(T)

也可以使用方括号:

创建数组案例:

复制代码
:) SELECT array(1, 2)AS x, toTypeName(x)
​
SELECT
​
   [1, 2] AS x,
​
   toTypeName(x)
​
┌─x─────┬─toTypeName(array(1,2))─┐
​
│ [1,2] │Array(UInt8)            │
​
└───────┴─────────────────────────┘
1 rows in set. Elapsed:0.002 sec.
复制代码
:) SELECT [1, 2] AS x,toTypeName(x)
​
SELECT
​
   [1, 2] AS x,
​
   toTypeName(x)
​
┌─x─────┬─toTypeName([1,2])─┐
​
│ [1,2] │Array(UInt8)       │
​
└───────┴────────────────────┘
​
1 rows in set. Elapsed:0.002 sec.

4.7 元组

Tuple(T1,T2, ...)**:**元组,其中每个元素都有单独的类型。

创建元组的示例:

复制代码
:) SELECT tuple(1,'a')AS x, toTypeName(x)
​
SELECT
    (1, 'a') AS x,
    toTypeName(x)
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
​
│ (1,'a') │ Tuple(UInt8, String)      │
​
└─────────┴───────────────────────────┘
1 rows in set. Elapsed:0.021 sec.

4.8 Date

日期类型,用两个字节存储,表示从1970-01-01 (无符号) 到当前的日期值。

还有很多数据结构,可以参考官方文档:https://clickhouse.yandex/docs/zh/data_types/

5 ClickHouse表引擎

表引擎(即表的类型)决定了:

1)数据的存储方式和位置,写到哪里以及从哪里读取数据

2)支持哪些查询以及如何支持。

3)并发数据访问。

4)索引的使用(如果存在)。

5)是否可以执行多线程请求。

6)数据复制参数。

ClickHouse的表引擎有很多,下面介绍其中几种,对其他引擎有兴趣的可以去查阅官方文档:https://clickhouse.yandex/docs/zh/operations/table_engines/

5.1 TinyLog

最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。

该引擎没有并发控制

  • 如果同时从表中读取和写入数据,则读取操作将抛出异常;

  • 如果同时写入多个查询中的表,则数据将被破坏。

这种表引擎的典型用法是write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它比需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。 不支持索引。

案例:创建一个TinyLog引擎的表并插入一条数据

复制代码
:)create table t (aUInt16, b String) ENGINE=TinyLog;
​
:)insert into t (a, b)values (1, 'abc');

此时我们到保存数据的目录/var/lib/clickhouse/data/default/t中可以看到如下目录结构:

复制代码
[root@hadoop100 t]# ls
​
a.bin  b.bin sizes.json

a.bin 和 b.bin 是压缩过的对应的列的数据, sizes.json 中记录了每个 *.bin 文件的大小:

复制代码
[root@hadoop100 t]# cat sizes.json 

{"yandex":{"a%2Ebin":{"size":"28"},"b%2Ebin":{"size":"30"}}}

5.2 Memory

内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。读写操作不会相互阻塞,不支持索引。简单查询下有非常非常高的性能表现(超过10G/s)。

一般用到它的地方不多,除了用来测试,就是在需要非常高的性能,同时数据量又不太大(上限大概 1 亿行)的场景。

5.3 Merge

Merge 引擎 (不要跟 MergeTree 引擎混淆) 本身不存储数据,但可用于同时从任意多个其他的表中读取数据。读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表的索引(如果有的话)会被使用。

Merge 引擎的参数:一个数据库名和一个用于匹配表名的正则表达式。

案例:先建t1,t2,t3三个表,然后用 Merge 引擎的 t 表再把它们链接起来。

复制代码
:)create table t1 (idUInt16, name String) ENGINE=TinyLog;
​
:)create table t2 (idUInt16, name String) ENGINE=TinyLog;
​
:)create table t3 (idUInt16, name String) ENGINE=TinyLog;
​
​
:)insert into t1(id,name) values (1, 'first');
​
:)insert into t2(id,name) values (2, 'second');
​
:)insert into t3(id,name) values (3, 'i am in t3');
​
​
:)create table t (idUInt16, name String) ENGINE=Merge(currentDatabase(), '^t');
​
 
​
:) select * from t;
​
┌─id─┬─name─┐
​
│ 2 │ second │
​
└────┴──────┘
​
┌─id─┬─name──┐
​
│ 1 │ first │
​
└────┴───────┘
​
┌─id─┬─name───────┐
​
│ 3    │ i am in t3 │
​
└────┴────────────┘

5.4 MergeTree

Clickhouse 中最强大的表引擎当属 MergeTree (合并树)引擎及该系列(*MergeTree)中的其他引擎。

MergeTree 引擎系列的基本理念如下。当你有巨量数据要插入到表中,你要高效地一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。

格式:

ENGINE [=]MergeTree(date-column [, sampling_expression], (primary, key),index_granularity)

参数解读:

date-column ---类型为 Date 的列名。ClickHouse 会自动依据这个列按月创建分区。分区名格式为"YYYYMM" 。

sampling_expression ---采样表达式。

(primary, key) ---主键。类型为Tuple()

index_granularity ---索引粒度。即索引中相邻"标记"间的数据行数。设为 8192 可以适用大部分场景。

案例:

复制代码
create table mt_table (date  Date, id UInt8, name String)ENGINE=MergeTree(date, (id, name), 8192);
​
 
​
insert into mt_tablevalues ('2019-05-01', 1, 'zhangsan');
​
insert into mt_tablevalues ('2019-06-01', 2, 'lisi');
​
insert into mt_tablevalues ('2019-05-03', 3, 'wangwu');

在/var/lib/clickhouse/data/default/mt_tree下可以看到:

复制代码
[root@hadoop100 mt_table]# ls
​
20190501_20190501_2_2_0  20190503_20190503_6_6_0  20190601_20190601_4_4_0  detached

随便进入一个目录:

复制代码
[root@hadoop10020190601_20190601_4_4_0]# ls
​
checksums.txt  columns.txt date.bin  date.mrk  id.bin id.mrk  name.bin  name.mrk primary.idx
  • *.bin是按列保存数据的文件

  • *.mrk保存块偏移量

  • primary.idx保存主键索引

5.5 ReplacingMergeTree

这个引擎是在 MergeTree 的基础上,添加了"处理重复数据"的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。

格式:

ENGINE [=] ReplacingMergeTree(date-column[, sampling_expression], (primary, key), index_granularity, [ver])

可以看出他比MergeTree只多了一个ver,这个ver指代版本列。

案例:

复制代码
create table rmt_table(date  Date, id UInt8, name String,pointUInt8) ENGINE= ReplacingMergeTree(date, (id, name), 8192,point);

插入一些数据:

复制代码
insert into rmt_tablevalues ('2019-07-10', 1, 'a', 20);
​
insert into rmt_tablevalues ('2019-07-10', 1, 'a', 30);
​
insert into rmt_tablevalues ('2019-07-11', 1, 'a', 20);
​
insert into rmt_tablevalues ('2019-07-11', 1, 'a', 30);
​
insert into rmt_tablevalues ('2019-07-11', 1, 'a', 10);

等待一段时间或optimize table rmt_table手动触发merge,后查询

复制代码
:) select * fromrmt_table;
​
┌───────date─┬─id─┬─name─┬─point─┐
​
│ 2019-07-11 │ 1 │ a    │   30 │
​
└────────────┴────┴──────┴───────┘

5.6 SummingMergeTree

该引擎继承自 MergeTree。区别在于,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。

语法:

ENGINE [=]SummingMergeTree(date-column [, sampling_expression], (primary, key),index_granularity, [columns])

columns ---包含将要被汇总的列的列名的元组

案例:

复制代码
create table smt_table(date Date, name String, a UInt16, b UInt16) ENGINE=SummingMergeTree(date, (date,name), 8192, (a))

插入数据:

复制代码
insert into smt_table(date, name, a, b) values ('2019-07-10', 'a', 1, 2);
​
insert into smt_table(date, name, a, b) values ('2019-07-10', 'b', 2, 1);
​
insert into smt_table(date, name, a, b) values ('2019-07-11', 'b', 3, 8);
​
insert into smt_table(date, name, a, b) values ('2019-07-11', 'b', 3, 8);
​
insert into smt_table(date, name, a, b) values ('2019-07-11', 'a', 3, 1);
​
insert into smt_table(date, name, a, b) values ('2019-07-12', 'c', 1, 3);

等待一段时间或optimize table smt_table手动触发merge,后查询

复制代码
:) select * fromsmt_table 
​
 
​
┌───────date─┬─name─┬─a─┬─b─┐
​
│ 2019-07-10 │ a    │ 1 │ 2 │
​
│ 2019-07-10 │ b    │ 2 │ 1 │
​
│ 2019-07-11 │ a    │ 3 │ 1 │
​
│ 2019-07-11 │ b    │ 6 │ 8 │
​
│ 2019-07-12 │ c    │ 1 │ 3 │
​
└────────────┴──────┴───┴───┘

发现2019-07-11,b的a列合并相加了,b列取了8(因为b列为8的数据最先插入)。

5.7 Distributed

分布式引擎,本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。

Distributed(cluster_name,database, table [, sharding_key])

参数解析:

cluster_name - 服务器配置文件中的集群名,在/etc/metrika.xml中配置的

database -- 数据库名

table -- 表名

sharding_key -- 数据分片键

案例演示:

1)在hadoop100,hadoop101,hadoop102上分别创建一个表t

复制代码
:)create table t(idUInt16, name String) ENGINE=TinyLog;

2)在三台机器的t表中插入一些数据

复制代码
:)insert into t(id,name) values (1, 'zhangsan');
​
:)insert into t(id,name) values (2, 'lisi');

3)在hadoop100上创建分布式表

复制代码
:)create tabledis_table(id UInt16, name String) ENGINE=Distributed(perftest_3shards_1replicas,default, t, id);

4)往dis_table中插入数据

复制代码
:) insert intodis_table select * from t

5)查看数据量

复制代码
:) select count() fromdis_table 
​
FROM dis_table 
​
┌─count()─┐
​
│       8 │
​
└─────────┘
​
:) select count() fromt
​
SELECT count()
​
FROM t 
​
┌─count()─┐
​
│       3 │
​
└─────────┘

可以看到每个节点大约有1/3的数据

6 ClickHouse之SQL语法

可参考官网:

ClickHouse SQL 语句 | ClickHouse Docs

6.1 CREATE

6.1.1 CREATE DATABASE

用于创建指定名称的数据库,语法如下:

CREATE DATABASE [IF NOTEXISTS] db_name

如果查询中存在IF NOTEXISTS,则当数据库已经存在时,该查询不会返回任何错误。

:) create databasetest;

Ok.

0 rows in set. Elapsed:0.018 sec.

6.1.2 CREATE TABLE

对于创建表,语法如下:

CREATE TABLE [IF NOTEXISTS] [db.]table_name [ON CLUSTER cluster]

(

name1 [type1] [DEFAULT|MATERIALIZED|ALIASexpr1],

name2 [type2] [DEFAULT|MATERIALIZED|ALIASexpr2],

...

) ENGINE = engine

DEFAULT expr -- 默认值,用法与SQL类似。

MATERIALIZED expr -- 物化表达式,被该表达式指定的列不能被INSERT,因为它总是被计算出来的。 对于INSERT而言,不需要考虑这些列。另外,在SELECT查询中如果包含星号,此列不会被查询。

ALIAS expr -- 别名。

有三种方式创建表:

1)直接创建

:) create table t1(idUInt16,name String) engine=TinyLog

2)创建一个与其他表具有相同结构的表

CREATE TABLE [IF NOTEXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]

可以对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎。

:) create table t2 ast1 engine=Memory

:) desc t2

3)使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。

语法:

CREATE TABLE [IF NOTEXISTS] [db.]table_name ENGINE = engine AS SELECT ...

实例:

先在t2中插入几条数据

:) insert into t1values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')

:) create table t3engine=TinyLog as select * from t1

:) select * from t3

主要用于向表中添加数据,基本格式如下:

INSERT INTO [db.]table[(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

实例:

:) insert into t1values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')

还可以使用select来写入数据:

INSERT INTO [db.]table[(c1, c2, c3)] SELECT ...

实例:

:)insert into t2 select * from t3

:)select * from t2

ClickHouse不支持的修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。

6.3 ALTER

ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本语法:

ALTER TABLE [db].name[ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

参数解析:

ADD COLUMN -- 向表中添加新列

DROP COLUMN -- 在表中删除列

MODIFY COLUMN -- 更改列的类型

案例演示:

1)创建一个MergerTree引擎的表

create table mt_table (date Date, id UInt8, name String)ENGINE=MergeTree(date, (id, name), 8192);

2)向表中插入一些值

insert into mt_tablevalues ('2019-05-01', 1, 'zhangsan');

insert into mt_tablevalues ('2019-06-01', 2, 'lisi');

insert into mt_tablevalues ('2019-05-03', 3, 'wangwu');

3)在末尾添加一个新列age

:)alter table mt_tableadd column age UInt8

:)desc mt_table

:) select * frommt_table

4)更改age列的类型

:)alter table mt_table modifycolumn age UInt16

:)desc mt_table

5)删除刚才创建的age列

:)alter table mt_tabledrop column age

:)desc mt_table

6.4 DESCRIBE TABLE

查看表结构

:)desc mt_table

6.5 CHECK TABLE

检查表中的数据是否损坏,他会返回两种结果:

0 -- 数据已损坏

1 -- 数据完整

该命令只支持Log,TinyLog和StripeLog引擎。

相关推荐
更深兼春远2 天前
flink+clinkhouse安装部署
大数据·clickhouse·flink
Sais_Z6 天前
ClickHouse的学习与了解
数据库·clickhouse
风中凌乱9 天前
ClickHouse-Backup的安装与部署
clickhouse
风中凌乱9 天前
clickhouse集群的安装与部署
clickhouse
白眼黑刺猬9 天前
ClickHouse从入门到企业级实战全解析课程简介
clickhouse
chenglin01612 天前
ClickHouse、Doris、OpenSearch、Splunk、Solr系统化分析
clickhouse·solr·lucene
慕y27412 天前
Java学习第一百一十七部分——ClickHouse
java·学习·clickhouse
zuozewei18 天前
随笔之 ClickHouse 列式分析数据库安装注意事项及基准测试
数据库·clickhouse
牛牛木有坏心眼(大数据进阶)19 天前
linux系统离线环境安装clickhouse客户端
linux·clickhouse
许心月19 天前
Clickhouse#表记录转换为insert语句
clickhouse