ClickHouse

ClickHouse

一、clickhouse介绍

1、简介
		clickhouse是用于联机分析的列式数据库管理系统,主要用于在线分析处理数据,能使用	sql语句实时生成分析数据报告。
2、优点
	*支持海量数据
	*运算速度快,可进行实时分析
	*易扩容,高可用
	*支持sql语句
	......
3、缺点
	*不支持事物
	*不支持高并发
	*多表join性能不好
	*元数据管理需要人为干预
	......
4、应用场景
	*实时分析
	*大多是读操作
	*表很宽
	*要求延迟低
	......
5、核心概念
	数据分片、列式存储、分区、副本备份、引擎...

二、clickhouse部署

安装--配置文件--分发等操作
到 /usr/bin 下执行启动命令 --之后在任意位置启动客户端命令
启动:clickhouse-server start
重启:service clickhouse-server restart
关闭:service clickhouse-server stop
客户端:clickhouse-client -m

详细信息见另一个文档.....

三、基础操作

3.1基本数据类型

show databases;
create database if not exists mydata;
use mydata;
select currentDatabase();
drop database mydata;
--1、注意在CK中关键字严格区分大小写   ck中建表的时候 ,一定指定表引擎!
  
2、基本数据类型
   Int8、Int16、Int64
   UInt....非负整数
   Float32、Float64
   Decimal...精确小数
   String
   FixedString(5)--指定字符串的最大长度
   UUID、随机数--generateUUIDv4()
   Date...年月日
   DateTime....年月日 时分秒
   DateTime64...年月日 时分秒,可以记录亚秒,它在DateTime之上增加了精度的设置
例如:
drop table test;
	create table test(
    id Int8,
    age UInt8,
    sal Float64,
    name  FixedString(10),
    sid  UUID,
    birthday DateTime
    )
    engine=MergeTree()
    order by id
    ;
    insert into table test values(11,20,1000.345,'zss',generateUUIDv4(),now());
    insert into table test values(12,22,1030.345,'lss',generateUUIDv4(),now());

3.2复杂数据类型

--Enum 枚举
	定义:color Enum('red'=1 , 'green'=2 , 'blue'=3)
	建表:
	create table test_enum(id Int8 , color Enum('red'=1 , 'green'=2 , 'blue'=3)) engine=Memory ;
	插入数据:insert into  test_enum values(1,'red'),(1,1),(2,'green');
	查询:select * from test_enum;
--Array 数组
	定义:[1,2,3]、array('a' , 'b' , 'c')
	建表:create table test_array(id Int8 ,hobby Array(String))engine=Memory ;
	插入数据:insert into test_array values(1,['eat','drink','la']),(2,array('sleep','palyg','sql'));
	查询:select id , hobby  , toTypeName(hobby) from test_array ;
		select id , hobby[2]  , toTypeName(hobby) from test_array ;
        -- 数组的取值,hobby[1]数组的索引从1开始
--Tuple 元祖
	定义:tuple(1,'asb',12.23)
	建表:CREATE TABLE test_tuple ( c1 Tuple(UInt8, String, Float64) )ENGINE=Memory; 
	插入数据:insert into table test_tuple values((1,'a',22.33));
	查询:select * from test_tuple;
--Nested 嵌套表结构
	建表:create table test_nested(
         uid Int8 ,
         name String ,
         props Nested(
           pid Int8,
           pnames String ,
           pvalues String
         )
       )engine = Memory ;
	注意:pid和pname、pvalues都是数组
	插入数据:insert into test_nested values(1,'hadoop',[1,2,3],['p1','p2','p3'],                ['v1','v2','v3']);
	查询:select * from test_nested;
	注意:嵌套类型本质是一种多维数组的结构。
		 嵌套表中的每个字段都是一个数组,
		 并且行与行之间数组的长度无须对齐
		 但是:在同一行数据内每个数组字段的长度必须相等。
--IPv4 IP数据
	定义:ip IPv4;
	建表:
		create table test_ip(id UInt8,ip IPv4 )engine=Memory();
		insert into table test_ip values(1,'192.168.3.2');--若ip地址格式不对则会报错
		select * from test_ip;
--Boolean和Nullable
    ck中没有Boolean类型 ,使用10来代表truefalse 
    Nullable 某种数据类型允许为null , 或者是没有给值的情况下模式是NULL

3.3建表语法

1、建表
	一定要指定引擎
	若为MergeTree引擎,则一定有主键和排序字段
2、只有MergeTree引擎的表才支持表的修改操作(alter操作)
	添加字段:
		alter table tb_test2 add column gender String after name ;
	删除字段:
		alter table tb_test2 drop column age ;

3.4 插入导出数据

1insert into table test1 values()
2insert into table test select ....
3、静态数据导入
  -- 将数据导入到表中--在非客户端操作
  cat user.txt  | clickhouse-client  -q 'insert into default.test_load1 format CSV' 
  或者
  clickhouse-client  -q 'insert into default.test_load1 format CSV'  <  user.txt
4、将数据导出
     clickhouse-client -h 127.0.0.1 --database="db" --query="select * from            db.test_table FORMAT CSV" > test.csv

3.5 更新删除分区操作

--注意数据的修改和删除操作是使用用MergeTree家族引擎:
 
-- 删除分区数据 
alter table test_muta drop  partition 'SH' ;
alter table test_muta delete where id=3 ;  -- 一定加条件
--条件更新数据
alter table test_muta update name='李思思'  where id=3 ;
--复制分区数据,前提是表结构(排序分区啥的)都相同
ALTER TABLE  B  REPLACE PARTITION partition_name FROM A 
--装载卸载分区
卸载:相当于这个分区失去了与总表的联系,查询的时候查询不到,但数据并未消失,而是被转移到了	  当前数据表目录的detached子目录下
装载:相当于重新建立了与总表的联系
卸载分区:alter table test_rep detach partition '202105' ;
装载分区:alter table test_rep attach partition '202105' ;

3.6视图操作

clickhouse中有两种视图:普通视图和物化视图
视图的作用:提供简单的查询代理--相当于一个查询的连接

--普通视图:
	不会存储数据,只提供查询代理
create view count_view as select count(1) from test;
select * from count_view ;

--物化视图:
	视图的结果会存储下来,最重要的是可以实时更新,只要源数据更改,视图数据也会进行更新
create materialized view count_view2 engine = Log populate as select count(1) from test;
select * from count_view2 ;
--此时向原表中添加数据,物化视图表也会进行更新

四、引擎详解

引擎的重要性
	1)数据的存储位置和方式,写到哪里以及从哪里读数据
	2)支持哪些查询以及如何支持
	3)索引的使用(如果存在索引)
	4)是否可执行多线程
	5)是否可以存储数据副本
	.....

4.1Log引擎

Log家族具有最小功能的轻量级引擎。使用并不多

4.2 MergeTree 系列引擎

核心的一种引擎:MergeTree --排序,区内合并
	MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,后续会进行区内合并,同一个区的合并到一起。
使用此引擎,必须指定主键和排序字段。因为此引擎会进行区合并和区内排序,所以必须指定排序字段
  建表:
      create table tb_merge_tree(
      id Int8 ,
      city String ,
      ctime Date 
      )
      engine=MergeTree()--设置引擎
      order by id --排序字段
      primary key id --主键字段
      partition by city --分区字段
	  ;
	  --当只有排序字段时,默认主键与排序字段一致
--1)MergeTree
	手动合并:optimize table test_1 final ;
	
--2)ReplacingMergeTree
	增加了去重功能:同一区内排序相同数据会被清掉(后台处理需要时间,可以手动合并)
	无版本参数:去重时则保留最新插入的数据
    	engine = ReplacingMergeTree()
	有版本参数:参数可以是时间或者版本号,去重时按照时间或者版本号来保留最新的数据
		engine = ReplacingMergeTree(ctime)
                                    
--3)CollapsingMergeTree
	折叠合并树引擎:对数据记录一个标记,1或者-1
     1为有效数据,-1为该删除的数据,当区相同,排序字段又相同时1-1必须成对使用才有效,且	   必须是1在前,-1在后,才会进行删除。
     在建表的时候单独用一个字段来记录1或者-1这个标记  【sign Int8】                     
     问题:在并发写入的时候,并不能保证标记为1的数据先行插入
                                    
--4)VersionCollapsingMergeTree
	解决了CollapsingMergeTree的问题,新增加一个版本标记,若分区、主键排序、版本都相同,		且标记为1-1,则就回进行删除。不需要必须是1在前-1在后。
                                    
--5)SummingMergeTree
	预聚合引擎:只做聚合函数的查询,会将区和主键排序都相同的数据中的数字的字段进行聚合
     不给参数:对表中所有的数值字段都进行聚合                               
	给 参 数:只对所给的参数进行聚合
 		当engine=SummingMergeTree(money)给了参数money的时候,则只会对money进行聚合                      
--6)AgregateingMergeTree   
     算是SummingMergeTree的升级版   
     在使用的时候有着 特殊的定义、插入数据、查询数据的方式  
 以建立一个AgregateingMergeTree引擎的物化视图为例:
  -- 建立明细表
CREATE TABLE orders
(
    uid UInt64,
    money UInt64,
    ctime Date,
    Sign Int8
)
ENGINE =MergeTree(Sign)
ORDER BY uid;

--插入数据 
insert into orders values(1,100,toDate(now()),1) ;
insert into orders values(1,100,toDate(now()),1) ;
insert into orders values(1,100,toDate(now()),1) ;
insert into orders values(2,200,toDate(now()),1) ;
insert into orders values(2,200,toDate(now()),1) ;
insert into orders values(2,200,toDate(now()),1) ;

-- 将聚合逻辑创建成物化视图,以实现同步更新预聚合表
---预聚合表只能是这种查询导入的方式插入数据,不能直接insert into values....
CREATE MATERIALIZED VIEW orders_agg_view
ENGINE = AggregatingMergeTree() --该物化视图的引擎为AggregatingMergeTree
PARTITION BY toDate(ctime)
ORDER BY uid 
populate
as select 
uid ,
ctime ,
sumState(money) as mm-- 注意别名 --注意此处用的是sumState(money)--sum为求和的聚合函数
from 
orders
group by uid , ctime;

-- 查询物化视图数据--注意查询的时候使用的是sumMerge(mm)
select uid,ctime,sumMerge(mm) from orders_agg_view group by uid, ctime ;  

4.3 外部引擎

--1)Hdfs 引擎
	可以实现直接从Hdfs文件中的·数据进行读取,以读取的数据进行建表,很是方便
	--注:
		*引擎中地址给的是Hdfs的绝对路径
		*.txt 代表所有的以.txt结尾的文件
		*a_{1..5}.txt代表所有以a_1.txt到a_5.txt的文件
    创建文件,将文件上传到指定的目录下
    1.txt
    1,zss,21
    2,ww,22

    2.txt 
    3,lss,33
    4,qaa,32

    3.txt 
    5,as,31
    6,ghf,45
    
    --匹配单个字符 
    create table test_hdfs2(
    id Int8 ,
    name String ,
    age Int8
    )engine=HDFS('hdfs://linux01:8020/ck/test1/?.txt' ,CSV) ;
    -- 匹配数字之间的文件
    create table test_hdfs3(
    id Int8 ,
    name String ,
    age Int8
    )engine=HDFS('hdfs://linux01:8020/ck/test1/a_{1..2}.txt' ,CSV) ;
--2)MySQL 表引擎  可以将Mysql中的表的数据导入进来

-- 在mysql中建表 
create table tb_x(id int, name varchar(25), age int) ;
insert into tb_x values(1,'zss',23),(2,'lss',33) ;
-- 在clickhouse中建表 
CREATE TABLE tb_mysql
(
    `id` Int8,  --注意有  的字符
    `name` String,
    `age` Int8
)
ENGINE = MySQL('doit01:3306', 'test1', 'tb_x', 'root', 'root');
--引擎中的数据为:域名:端口,数据库,表,用户名,密码

查看数据
select * from tb_mysql;
插入数据
insert into tb_mysql values(3,'ww',44) ;

- 支持查询数据 
- 支持插入数据
- 不支持删除和更新操作 


--3)MySQL 数据库引擎 --可以将Mysql中的数据库复制一份过来
create database db_ck_mysql engine=MySQL('doit01:3306','test1','root','root') ;
--file引擎

4.4 内存引擎

--1)Memory 引擎
	常用于测试,数据存在内存中,当服务器断开的时候,数据也随之消失
--2)Buff引擎
	当某个表有个高并发的写入的时候,可以考虑使用BUff缓冲表
	*缓冲表当达到刷写时机的时候,便会向总表进行刷写
	*当服务器断开的时候会造成数据丢失
	*我们仅建议在极少数情况下使用Buffer表。
	 1) 创建一个目标表
     create table tb_user(uid Int8 , name String) engine=TinyLog ;
     2) 创建一个缓存表
     CREATE TABLE tb_user_buffer AS tb_user ENGINE = Buffer(default, tb_user, 16, 10, 100, 10000, 1000000, 10000000, 100000000) ;
     --引擎中的数据为:表所在的库,表名,线程数(默认16),最小最大时间(秒),最小最大行数,最小最大字节数---以上三个条件达到其中之一的阈值便会刷写
     3) 向缓存表中插入数据
     insert into tb_user_buffer values(1,'Yang'),(2,'Haha') ,(3,'ADA') ;
     4) 等待以后查看目标表中的数据
     select * from tb_user ;

五 查询语法

5.1 with

--1) 定义变量
    WITH 
        1 AS start,
        10 AS end
    SELECT 
        id + start,
        *
    FROM tb_mysql
--2)调用函数
	WITH
    toDate(birthday) AS bday
    SELECT 
        id,
        name,
        bday
    FROM tb_partition
--3)子查询
    WITH 
         (
             SELECT *
             FROM tb_partition
             WHERE id = 1
         ) AS sub
     SELECT 
         *,
         sub
     FROM tb_partition

5.2 外部查询数据

1:从hdfs中读取数据
select * from hdfs ('文件路径',文件格式,‘表的结构’)
select * from hdfs ('hdfs://linux01:8020/data/a.csv',CSV,'id Int8,name String');
2:从本地中读取数据
select * from file('/chbase/data/user_files/a.csv',CSV,'id Int8,name String');
3:从mysql中读取数据
select * from mysql('linux01:3306','mysql','test_1','root','123456');

5.3 array join

array join 似于hive中的explode炸裂函数的功能!
--案例:
求每个店铺的最大连续销售天数:
数据:
a,2017-02-05,200
a,2017-02-06,300
a,2017-02-07,200
a,2017-02-08,400
a,2017-02-08,300
a,2017-02-10,600
b,2017-02-05,200
b,2017-02-06,300
b,2017-02-08,200
b,2017-02-09,400
b,2017-02-10,600
c,2017-01-31,200
c,2017-02-01,300
c,2017-02-02,200
c,2017-02-03,400
c,2017-02-10,600
a,2017-03-01,200
a,2017-03-02,300
a,2017-03-03,200
a,2017-03-04,400
a,2017-03-05,600
建表:
create table test_11(
name String ,
cdate Date,
money UInt16
)
engine=ReplacingMergeTree()
order by (name,cdate)
;
导入数据:
clickhouse-client  -q 'insert into default.test_11 format CSV'  <  b.csv
---b.csv是linux本地的文件
┌─name─┬──────cdate─┬─money─┐
│ a    │ 2017-02-05200 │
│ a    │ 2017-02-06300 │
│ a    │ 2017-02-07200 │
│ a    │ 2017-02-08400 │
│ a    │ 2017-02-08300 │
│ a    │ 2017-02-10600 │
│ a    │ 2017-03-01200 │
│ a    │ 2017-03-02300 │
│ a    │ 2017-03-03200 │
│ a    │ 2017-03-04400 │
│ a    │ 2017-03-05600 │
│ b    │ 2017-02-05200 │
│ b    │ 2017-02-06300 │
│ b    │ 2017-02-08200 │
│ b    │ 2017-02-09400 │
│ b    │ 2017-02-10600 │
│ c    │ 2017-01-31200 │
│ c    │ 2017-02-01300 │
│ c    │ 2017-02-02200 │
│ c    │ 2017-02-03400 │
│ c    │ 2017-02-10600 │
└──────┴────────────┴───────┘
第一步:做编号
with
groupArray(cdate) as dates,
arrayEnumerate(dates) as indxs
select
name,
dates,
indxs
from
test_11
group by name
;
第二步:打上编号
select
name,
ds,
ins 
from
(
with
groupArray(cdate) as dates,
arrayEnumerate(dates) as indxs
select
name,
dates,
indxs
from
test_11
group by name
)
array join dates as ds,indxs as ins
;
┌─name─┬─────────ds─┬─ins─┐
│ b    │ 2017-02-051 │
│ b    │ 2017-02-062 │
│ b    │ 2017-02-083 │
│ b    │ 2017-02-094 │
│ b    │ 2017-02-105 │
│ c    │ 2017-01-311 │
│ c    │ 2017-02-012 │
│ c    │ 2017-02-023 │
│ c    │ 2017-02-034 │
│ c    │ 2017-02-105 │
│ a    │ 2017-02-051 │
│ a    │ 2017-02-062 │
│ a    │ 2017-02-073 │
│ a    │ 2017-02-084 │
│ a    │ 2017-02-105 │
│ a    │ 2017-03-016 │
│ a    │ 2017-03-027 │
│ a    │ 2017-03-038 │
│ a    │ 2017-03-049 │
│ a    │ 2017-03-0510 │
└──────┴────────────┴─────┘
第三:相减
select 
name,
date_sub(Day,ins,ds) sub
from
(
  select
  name,
  ds,
  ins 
  from
  (
    with
    groupArray(cdate) as dates,
    arrayEnumerate(dates) as indxs
    select
    name,
    dates,
    indxs
    from
    test_11
    group by name
    )
  array join dates as ds,indxs as ins
) 

;
第四:分组聚合--求最大
name,
date_sub(Day,ins,ds) sub,
count(1) counts
from
(
  select
  name,
  ds,
  ins 
  from
  (
    with
    groupArray(cdate) as dates,
    arrayEnumerate(dates) as indxs
    select
    name,
    dates,
    indxs
    from
    test_11
    group by name
    )
  array join dates as ds,indxs as ins
) 
group by name,sub
order by name,counts desc
limit 1 by name
;

5.4 关联查询

--all 全连接
	all inner 或者直接all都跟正常的join一样
        SELECT *
        FROM yg AS inser
        ALL INNER JOIN gz ON yg.id = gz.id ;
        SELECT *
        FROM yg AS inser
        ALL  JOIN gz ON yg.id = gz.id ;
	─id─┬─name─┬─age─┬─bid─┬─gz.id─┬───jb─┬───jj─┐
│  1 │ AA   │  231110002000 │
│  1 │ AA   │  231110002000 │
│  2 │ BB   │  242220001233 │
│  3 │ VV   │  271320003000--any 只连接一条
	当左表的某一行数据可以关联右表的多行数据时,此时只会关联一行,而不是多行都关联
        SELECT *
        FROM yg
        ANY INNER JOIN gz ON yg.id = gz.id
	┌─id─┬─name─┬─age─┬─bid─┬─gz.id─┬───jb─┬───jj─┐
│  1 │ AA   │  231110002000 │
│  2 │ BB   │  242220001233 │
│  3 │ VV   │  271320003000 

---- ASOF inner join 
	当有多个关联条件时,要使用 ASOF inner join
	select * from A ASOF inner join B ON a.id=b.id and a.sal>b.sal

5.5 with模型–构建立方体

- With cube --全维度立方体
- With rollup--按照区主键增加,上卷
- With totals--只做总体的111和000
--数据
drop table is exists tb_with ;
create table tb_with(
	id UInt8 ,
	vist UInt8,
    province String ,
    city String ,
    area String
)engine=MergeTree() 
order by id ;
insert into tb_with values(1,12,'山东','济南','历下') ;
insert into tb_with values(2,12,'山东','济南','历下') ;
insert into tb_with values(3,12,'山东','济南','天桥') ;
insert into tb_with values(4,12,'山东','济南','天桥') ;
insert into tb_with values(5,88,'山东','青岛','黄岛') ;
insert into tb_with values(6,88,'山东','青岛','黄岛') ;
insert into tb_with values(7,12,'山西','太原','小店') ;
insert into tb_with values(8,12,'山西','太原','小店') ;
insert into tb_with values(9,112,'山西','太原','尖草坪') ;
--查询:
(1)
SELECT  province,city,area,sum(vist)
FROM    tb_with
GROUP BY province,city,area
WITH CUBE ;
(2)
SELECT  province,city,area,sum(vist)
FROM    tb_with
GROUP BY province,city,area
WITH rollup ;
(3)
SELECT  province,city,area,sum(vist)
FROM    tb_with
GROUP BY province,city,area
WITH totals ;

六、函数

clickhouse中的函数很丰富,用到时可去官网搜索

6.1 类型转换函数

toInt8   toFloat32 ....
toDate   toDate32 .....
toString ...

CAST
	SELECT
    CAST(timestamp AS DateTime) AS datetime,
    CAST(timestamp AS Date) AS date;
   

6.2日期函数

date_sub   date_diff 
.....

6.3 if、multiIf 函数

if(exp1 , exp2,exp3) 相当于三目运算符
	若exp1成立,则执行exp2 ,否则执行exp3
multiIf(exp1,value1, exp2,value2,exp3value3,other)
例如:
SELECT 
    *,
    if(gender = 'M', '男', '女')
FROM tb_if

SELECT 
    *,
    multiIf(gender = 'M', '男', gender = 'F', '女', '保密') AS sex
FROM tb_if

6.4 json数据解析

1--json数据解析
数据:
	{"movie":"2398","rate":"4","timeStamp":"978302281","uid":"1"}
    {"movie":"2918","rate":"4","timeStamp":"978302124","uid":"1"}
    {"movie":"1035","rate":"5","timeStamp":"978301753","uid":"1"}
    {"movie":"2791","rate":"4","timeStamp":"978302188","uid":"1"}
    {"movie":"2687","rate":"3","timeStamp":"978824268","uid":"1"}
    {"movie":"2018","rate":"4","timeStamp":"978301777","uid":"1"}
    {"movie":"3105","rate":"5","timeStamp":"978301713","uid":"1"}
    {"movie":"2797","rate":"4","timeStamp":"978302039","uid":"1"}
建表:
	create table test_movie (
      strs String
      )engine=Log;
导入数据:在客户端外面,movie.json所在的位置,可以不写movie.json的路径
clickhouse-client  -q 'insert into test_movie format JSONAsString' < movie.json
查询数据并解析:
	with
    visitParamExtractRaw(strs,'movie') as movie,
    visitParamExtractRaw(strs,'rate') as rate,
    visitParamExtractRaw(strs,'timeStamp') as tims,
    visitParamExtractRaw(strs,'uid') as uid
    select 
    movie,
    toInt8(replaceAll(rate,'"','')) as rat,
    tims,
    uid
    from 
    test_movie;

七、分布式

clickhouse采用的是多主架构,并且用zookeeper进行管理。而非主从架构。
节点之间可以任意的组成集群,把比如linux1、2集群;Linux1、2、3集群

7.1 配置zookeeper

—查看源文件

7.2 创建分布式表,进行分布式存储和查询

--分布式表的作用:
	分布式表起着查询代理的作用。
	一个表有多个切片,每个切片还有多个副本,当插入数据的时候,若没有分布式表,则要到每台机器上进行插入,查询的时候同样要到不同机器上进行查询数据,之后还要将数据汇总。而且还会有插入和查询热点问题。
	*有了分布式表,插入和查询的时候直接找分布式表,分布式会指向本地表,方便很多。
	*而且在插入的时候采用随机数进行分片插入,便解决了插入热点的问题
	*在查询的时候,可以将分布式表建立在不同机器上,这样便解决了查询热点的问题,不管分布式表在几个机器上,指向的都是同一个本地表。
	插入的时候向分布式表插入,便会自动将数据插入到本地表中,查询的时候也是直接查询分布式表。
--注:有几台机器,最多就有几个分片,而且最多就有几个副本
  总而言之,linux01 、0203 在集群的配置文件中只能出现一次
  比如:三个分片,每个分片便没有副本,每个分片各占一个linux机器
步骤:
	1、在配置文件/etc/clickhouse-server/config.d/metrika.xml文件中配置分片和副本信息
		配置好后分发到linux02和linux03
	2、建本地表,指定所在的集群
	3、建分布式表,指定'查询代理'的对象
1)
<cluster2>
<!-- 集群名为cluster2 整个集群中每个表有三个分片,每个切片无副本,分别在lx01 lx02 lx03上 -->
 <shard>
  <replica>
  <host>linux01</host>
  <port>9000</port>
  </replica>
  </shard>
  
  <shard>
  <replica>
  <host>linux02</host>
  <port>9000</port>
  </replica>
  </shard>
  
  <shard>
  <replica>
  <host>linux03</host>
  <port>9000</port>
  </replica>
 </shard>
 
</cluster2>

2-- 创建本地表
create table tb_demo4 on cluster cluster2( --注意要指定集群
id  Int8 ,
name String 
)engine=MergeTree() 
order by  id ;
3-- 创建分布式表
create table demo4_all on cluster cluster2 engine=Distributed('cluster2','default','tb_demo4',id) as tb_demo4 ;

分布式表demo4_all也在集群cluster2上,
引擎采用Distributed(本地表的集群,库,表名,分片字段) 
as tb_demo4 指向本地表tb_demo4

4)插入数据 insert into table demo4_all values (2,'zaa');
   查询数据 select * from demo4_all;

八、应用案例

8.1 设置用户登录权限和使用权限

在 /etc/clickhouse-server/user.xml  而不是clickhouse的安装目录
1)设置用户登录权限
在user.xml中添加用户配置,在user中进行配置
<users>
    <default>
      <password></password>
      <networks incl="networks" replace="replace">
        <ip>::/0</ip>
      </networks>
      <profile>default</profile>
      <quota>default</quota>
    </default>
<!-- 定义一个用户 用户名为hangge 密码使用明文 root -->
<hangge>
<password_sha256_hex>f493c8a7a3c37088731336766459cc37e4b094e95b918038726660cc42013fcd</password_sha256_hex>
      <networks incl="networks" replace="replace">
        <ip>::/0</ip>
      </networks>
      <profile>default</profile>
      <quota>default</quota>
    </hangge>
  </users>
密码使用加密密码:
  密码:
	HA256加密:在使用SHA256加密算法的时候,需要通过password_sha256_hex标签定义密码
	echo -n root | openssl dgst -sha256    
	-->f493c8a7a3c37088731336766459cc37e4b094e95b918038726660cc42013fcd
<password_sha256_hex>f493c8a7a3c37088731336766459cc37e4b094e95b918038726660cc42013fcd</password_sha256_hex>

double_sha1加密:
在使用double_sha1加密算法的时候,则需要通过 password_double_sha1_hex标签定义密码,
echo -n 123456 | openssl dgst -sha1 -binary | openssl dgst -sha1 
(stdin)= 6bb4837eb74329105ee4568dda7dc67ed2ca2ad9
<password_sha256_hex>6bb4837eb74329105ee4568dda7dc67ed2ca2ad9</password_sha256_hex>
用户权限设置:--只允许查看default库
<hangge>
<password_sha256_hex>60cd41aedc4e47e8883682b416109e7b7e345e15decc63c2c98ecdab5e8e053a</password_sha256_hex>
    <networks incl="networks" />
    <profile>readonly</profile>   
    <quota>default</quota>
    <allow_databases>
        <database>default</database>
    </allow_databases>
</hangge>

8.2 工具

jdbc --java连接clickhouse
客户端工具 DBeaver  --类似Navicat 
http://ui.tabix.io/#!/login 提供的一个clickhouse页面可视化工具

8.3 用户行为分析

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值