ClickHouse(上)

  • 前言
  • 一、列式存储的优点
  • 二、ClickHouse瓶颈
  • 三、数据类型
  • 四、表引擎
  • 4.1 MergeTree
  • 4.1.1 分区
  • 4.1.2 主键
  • 4.1.3 order by(必选字段)
  • 4.1.4 TTL
  • 4.2 ReplacingMergeTree
  • 4.3 SummingMergeTree
  • 总结



前言

本文介绍了大数据中使用的一种数据库ClickHouse,它不同于传统的mysql数据库,ClickHouse是列式存储数据库(DBMS),主要用于在线分析查询处理(OLAP),同样的HBASE也是列式存储数据库。


一、列式存储的优点

(1)对于列的聚合,计数,求和等统计操作优于行式存储

(2)由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重。

(3)由于数据压缩比更好,节省了磁盘空间,使 cache 有了更大的发挥空间。

二、ClickHouse瓶颈

所有的CPU,也就意味着它处理多条查询命令的时候效率(QBS(Query per second)每秒钟的查询次数)不会很高。所以ClickHouse不适合做初始的数据处理,适合处理已经处理过的数据的宽表

三、数据类型

整型

类似于Java中的

无符号整型

浮点型

Decimal

字符串

枚举

int8

byte

Uint8

float32

Decimal32

String

Enum8

int16

short

Uint16

float64

Decimal64

FixedString(N)

Enum16

int32

int

Uint32

Decimal128

int64

long

Uint64

Decimal数据类型应用于金融领域,即和钱相关,因为他的数据精度不会丢失。

四、表引擎

4.1 MergeTree

最强大的表引擎当属 MergeTree(合并树)引擎及该系列(*MergeTree)中的其他引擎,支持索引和分区。

代码如下:

create table t(
	id UInt32,
	sku_id String,
	create_time Datetime
)engine = MergeTree
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id , sku_id);

注意:在ClickHouse中,主键并不唯一,所以底层也不会自动为我们加上唯一约束

4.1.1 分区

临时分区,不会纳入任何一个已有的分区。写入后的某个时刻(大概 10-15 分钟后),ClickHouse 会自动执行合并操作(也可以手动通过 optimize 执行),把临时分区的数据,合并到已有分区中。
代码如下:

optimize table xxxx final;

分区尽量以天为分区,不能分区粒度过小,这样会产生大量的数据,ClickHouse是基于内存的不善于处理大量的数据;

4.1.2 主键

ClickHouse中的主键,只提供了数据的一级索引,但是却不是唯一约束,并且底层运用了稀疏索引稀疏索引就是间隔一定的距离来存储主键的索引。

  稀疏索引的好处就是可以用很少的索引数据,定位更多的数据,代价就是只能定位到索引粒度的第一行,然后再进行进行一点扫描。

clickhouse 比mysql clickhouse对比mysql_clickhouse 比mysql

4.1.3 order by(必选字段)

分区内的数据按照哪些字段顺序进行有序保存。

唯一一个必填项,甚至比 primarykey 还重要,因为当用户不设置主键的情况,很多处理会依照 order by 的字段进行处理。

  要求:主键必须是 order by 字段的前缀字段。比如 order by 字段是 (id,sku_id) 那么主键必须是 id 或者(id,sku_id)

  索引(orderby())的原则查询频率高的放在前面基数特别大(比如某一列有1亿条数据,但是数据重复率很低)的不适合做索引;

  在ClickHouse中,建表时Index_granularity是用来控制索引粒度的默认是8192,如非必须不建议调整。

4.1.4 TTL

管理数据表或列的生命周期的功能。

列级别-实例是该列数据会在创建10秒之后消失:
代码如下:

create table t(
	id UInt32,
	sku_id String,
	cnum UInt8 TTL create_time+interval 10 SECOND,
	create_time Datetime
)engine = MergeTree
partition by (create_time)
primary key (id)
order by (id , sku_id);

表中的数据列cnum就会在10秒后消失;

表级别-实例是该表会在创建10秒之后消失:
代码如下:

alter table t MODIFY TTL create_time + interval 10 SECOND;

时间单位可以替换为:SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER, YEAR

4.2 ReplacingMergeTree

  ReplacingMergeTree 是 MergeTree 的一个变种,它存储特性完全继承 MergeTree,只是多了一个去重的功能。

  去重时机:数据的去重只会在合并的过程中出现。

  去重范围:如果表经过了分区,去重只会在分区内部进行去重,不能跨分区去重;

注意:ReplacingMergeTree不能保证没有重复数据的出现

ReplacingMergeTree特点

  ➢实际上是使用 order by 字段作为唯一键
  ➢去重不能跨分区
  ➢只有同一批插入(新版本)或合并分区时才会进行去重
  ➢认定重复的数据保留版本字段值最大的
  ➢如果版本字段相同则按插入顺序保留最后一笔

4.3 SummingMergeTree

预聚合”的引擎,同样是以orderby的字段进行聚合,即相当于是以orderby的字段进行groupby。

  (1) 只能分区内聚合
  (2) 分片合并的时候才会聚合

SummingMergeTree 特点
  ➢以 SummingMergeTree(A)中指定的列A作为汇总数据列
  ➢可以填写多列必须数字列,如果不填以所有非维度列且为数字列的字段为汇总数据列
  ➢以 order by 的列为准,作为维度列
  ➢其他的列按插入顺序保留第一行
  ➢不在一个分区的数据不会被聚合
  ➢只有在同一批次插入(新版本)或分片合并时才会进行聚合


总结

本文简单介绍了ClickHouse的基础概念以及表引擎等知识,在大数据之ClickHouse(下)中会继续介绍ClickHouse的相关的SQL操作、语法指令以及配置信息等。