Clickhouse——OLAP工具

1.基础知识

clickhouse的特点:
  • DBMS 的功能:使用SQL
  • 列式存储: 在列的统计计算上有优势,便于压缩,节省磁盘空间
  • 高吞吐写入能力:顺序写,充分利用了磁盘的吞吐能力
  • 数据分区与线程级并行:多核并行处理,单条查询就可以利用所有CPU,对应多并行查询优势不大
  • 多样化引擎: TinyLog(不支持索引,无并发控制),Memory (不支持索引),MergeTree(支持索引和分区) ,ReplacingMergeTree(有去重机制,对于order by后的字段分组去重,分区内有效,合并分区时触发,不定时触发),SummingMergeTree
  • 分区:提高查询效率
  • 分片:横向扩容,解决数据水平切分问题,
  • 副本:高可用,提高容错性

2. 语法知识

1. 数据类型
  • 整型:Int8,Int16,Int32,Int64;UInt8,UInt16,UInt32,UInt64
  • 浮点型:Float32,Float64
  • Decimal 型 :Decimal32(s),Decimal64(s),Decimal128(s)
  • 字符串:String(最常用),FixedString(N)
  • 枚举: Enum8 , Enum16
  • 时间类型:Date (‘2019-12-16’ ), Datetime (‘2019-12-16 20:50:10’),Datetime64(‘2019-12-16 20:50:10.66’)
2. 类型转换
  • toInt64OrNull('123123'), toInt8OrNull('123qwe123')
  • CAST(x, T),CAST(x AS t)
  • toString
  • toDate,toDateTime,toDate(toDateTime(unix_timestamp))
3. 建表语句
  • 单节点建表:
    必要:引擎,order by(order by中为索引)
    可选:分区,主键(必须为order by的最左边的字段)
    建表语句:

create table t_order_mt (id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime) engine =MergeTree partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id);

  • 副本建表:副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表
    engine =ReplicatedMergeTree
    指明副本:rep_102
    第一个参数:/clickhouse/table/{shard}/{table_name}

副本建表
create table t_order_rep2 (id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime ) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_102') partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id);

  • 分片建表:分布式表和本地表。分布式表不存储数据

本地表:
create table st_order_mt on cluster gmall_cluster ( id UInt32,sku_id String, total_amount Decimal(16,2),create_time Datetime ) engine =ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt','{replica}') partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id);
分布式表:
create table st_order_mt_all2 on cluster gmall_cluster ( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime )engine = Distributed(gmall_cluster,default, st_order_mt,hiveHash(sku_id));

3. select as建表

create table ods_peakreport.zss_tmp_date ENGINE = MergeTree() order by num_date as select * from ...

4. clickhouse优化

  • 数据类型:避免频繁转换,避免空值
  • 写入优化:尽量不要执行单条或小批量删除和插入操作,不要一次写入太多分区,会给merge带来压力
  • 语法规则优化:
    • 避免select
    • 大表关联小表:小表放右边
    • prewhere替代where
    • orderby 结合 where、limit
    • 物化视图
    • 分布式表使用 GLOBAL:两张分布式表上的 IN 和 JOIN 之前必须加上 GLOBAL 关键字

5. 物化视图

  • 概念:ClickHouse 的物化视图是一种查询结果的持久化,物化视图则是把查询的结果根据相应的引擎存入到了磁盘或内存中,它也像是一张时刻在预计算的表。
  • 优点:预计算特性,查询速度快
    缺点:流式数据的使用场景,是累加式的技术,很消耗机器资源
  • 语法:

CREATE MATERIALIZED VIEW hits_mv ENGINE=SummingMergeTree PARTITION BY toYYYYMM(EventDate) ORDER BY (EventDate, intHash32(UserID)) AS SELECT UserID, EventDate, count(URL) as ClickCount, sum(Income) AS IncomeSum FROM hits_test WHERE EventDate >= '2014-03-20'

6. 数据库引擎MaterializeMySQL

  • 概念:数据库映射到 MySQL 中 的某 个 database ,并 自动 在 ClickHouse 中 创建 对 应的 ReplacingMergeTree。ClickHouse 服务做为 MySQL 副本,读取 Binlog 并执行 DDL 和 DML 请求,实现了基于 MySQL Binlog 机制的业务数据库实时同步功能。
  • 特点:
    (1)MaterializeMySQL 同时支持全量和增量同步,在 database 创建之初会全量同步 MySQL 中的表和数据,之后则会通过 binlog 进行增量同步。
    (2)MaterializeMySQL database 为其所创建的每张 ReplacingMergeTree 自动增加了 _sign 和 _version 字段。 其中, _version 用作 ReplacingMergeTree 的 ver 版本参数,每当监听到 insert、update 和 delete 事件时,在 databse 内全局自增。而 _sign 则用于标记是否被删除,取值 1 或者 -1。
  • 语法
    (1)开启ck的物化引擎
    set allow_experimental_database_materialize_mysql=1;
    (2)ClickHouse 中创建 MaterializeMySQL 数据库
    create database test_binlog ENGINE = MaterializeMySQL('hadoop1:3306','testck','root','000000');
    其中 4 个参数分别是 MySQL 地址、databse、username 和 password。
    (3)测试
    use test_binlog; show tables; select * from t_organization; select * from t_user;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,815评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,251评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,999评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,996评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,993评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,477评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,848评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,823评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,361评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,401评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,518评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,119评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,850评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,292评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,424评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,072评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,588评论 2 365

推荐阅读更多精彩内容