1)安装curl工具
yum install -y curl
2)添加clickhouse的yum镜像
curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash
3)检查镜像情况
[root@doit04 yum.repos.d]# yum list | grep clickhouse
clickhouse-client.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse
clickhouse-common-static.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse
4)安装clickhouse的服务端和客户端
yum install -y clickhouse-server clickhouse-client
5)启动服务daunt
service clickhouse-server start
6)启动交互式客户端
clickhouse-client
列式存储的概念是把一列数据放到 一行去存储
二clickhouse是一个完全的分布式的列式存储的数据库,就是把一列数据存储到一个文件夹中
不同的引擎决定了不同的数据存储位置和特点
数据库引擎: engine=mysql (mysql的数据库)
表引擎 : 自己的特殊引擎
集成引擎: clickhouse极易和其他数据源整合 支持大量的函数效率很高C语言编写
引擎就是表的类型,不同的表有不同的特点,数据存储的位置,决定了表的操作行为.
service clickhouse-server start 开启客户端
clickhouse-client -m 开机
desc 加表名 查看表结构
create database 加库名; 建数据库 没有指定引擎就是默认引擎
show databases ; 查看所有数据库
use 加库名 ; 切换到输入的数据库
select currentDatabase() ; 查看当前正在使用的数据库
drop table 加表名 ; 删除表
CAST(字段名就是列名 as 新数据类型) 修改字段就是列的数据类型
decimal() 一个数据类型 括号里面是保留的小数个数 多了直接舍弃
表在虚拟机上存储的位置/var/lib/clickhouse/data
create table `tb_user`(
id String , 注意指定数据类型的首字母要大写
name String ,
age UInt8 , UInt8是一个数据类型正整数到155
birthday Date
) engine = Log; 指定引擎为Log引擎 这个引擎没用了解一下
数据存储在本地默认位置
向表中插入数据
insert into tb_user values('uid0002','wanggang',21,'1999-03-08');
MergerTree引擎底层存储数据以Tree基本存储结构
primary key 指定主键
order by 指定排序字段 如果指定了排序字段默认会指定主键
desc 加表名 查看表结构
optimize table 加表名 ; 表的合并
建表结构
create table tb_tree1(
id String ,
name String ,
city String
)
engine = MergeTree
order by id;
插入结构
insert into tb_tree1 values('id004','wb','HB');
建表
去重主键相同的数据 保留v版本大的数据 删除操作发生在合并时
create table tb_replacing_tree(
id String ,
name String ,
v UInt8
)
engine = ReplacingMergeTree(v) 指定引擎并且指定版本号为V
primary key id 指定主键
order by ctime; 指定排序
解决 ReplacingMergeTree 只能保留最大版本数据的限制
- 一个标记sign
create table tb_collapsing_mergeTree(
id String ,
name String ,
v UInt8 ,
flag Int8 sign标记
)
engine = CollapsingMergeTree(flag) order by id ;
这个-1就会删除前面所有主键相同的字段只保留一个离他最近的一个字段
insert into tb_collapsing_mergeTree2 values('a002','lss4',2 , 1) ;
insert into tb_collapsing_mergeTree2 values('a002','lss2',2 , -1) ;
insert into tb_collapsing_mergeTree2 values('a002','lss4',4 , 1) ;
指定删除数据的版本
create table tb_versioned_collapsing_mergetree(
id UInt8 ,
name String ,
version UInt8 ,
sign Int8
)
engine = VersionedCollapsingMergeTree(sign, version) 参数一是标记参数二是版本
order by id ;
看上面的建表参数三是版本参数四是标记他就会把版本相同的删除
insert into tb_versioned_collapsing_mergetree values(1,'a',1,1);
insert into tb_versioned_collapsing_mergetree values(1,'a',2,1) ;
insert into tb_versioned_collapsing_mergetree values(1,'a',2,-1) ;
先在mysql中建一个表
create table tb_user(
id Int ,
name varchar(20)
);
在里面插入数据
insert into tb_user(1,'zs'),(2,'ls');
在clichhouse中键表跟 mysql链接 不能在clickhouse的mysql库中建
这样这两个表数据就会相通操作同步 建表是两表格式要相同 clickhouse中的表删除对MySQL没影响
create table tb_user(
id Int32 ,
name String
)
engine=MySQL('linux01:3306','db_doit19','tb_user','root','root') ;
还可以建一个表跟 clickhouse的链接mysql表join在一起
create table tb_user2(id Int32 , name String) engine=Log ;
SELECT *
FROM tb_user
INNER JOIN tb_user2 ON tb_user.id = tb_user2.id
在hdfs上建表路径在linux中准备数据 传到hdfs上
hdfs dfs -mkdir -p /ch/data
vi user.tsv
hdfs dfs -put user.tsv /ch/data
在clickhouse建表并连接
create table tb_ch_hdfs(
uid String ,
name String ,
city String ,
age UInt8
)
engine = HDFS("hdfs://linux01:8020/ch/data/user.tsv" , "TSV") ; 指定引擎和路径
上面的元素二TSV是文件的分隔符代表空格
mysql引擎表 和 hdfs引擎表 和 ch原生表 关联查询 join join 有点乱
select
*
from
(select
tb_ch_hdfs.uid uid ,
tb_ch_hdfs.name hdfs_name,
tb_ch_hdfs.city hdfs_city,
tb_user2.id as id ,
tb_user2.name as ch_name
from
tb_ch_hdfs
join
tb_user2
on
tb_ch_hdfs.uid = CAST(tb_user2.id as String))t
join
tb_user
on
tb_user.id = t.id ;
SummingMergeTree(cost) – 将区内相同主键的所有的数据累加
建表
create table tb_summ_merge_tree(
id Int8 ,
name String ,
cDate Date ,
cost Float64
)
engine=SummingMergeTree(cost) 会把表中同一分区的cost字段相加返回一个和
order by id 排序字段
partition by name ; 分区字段
插入数据
insert into tb_summ_merge_tree values(1,'wangben','2020-12-06',9.9) ;
insert into tb_summ_merge_tree values(1,'wangben','2020-12-05',6.9) ;
insert into tb_summ_merge_tree values(1,'wangben','2020-12-03',6.9) ;
insert into tb_summ_merge_tree values(1,'wangben','2020-12-04',6.9) ;
合并数据
optimize table tb_summ_merge_tree ;
合并的时候一次只能合并一个分区的数据,最后展示出来的是一个分区一个表格
┌─id─┬─name──┬──────cDate─┬─cost─┐
│ 1 │ dezhi │ 2020-12-06 │ 16.8 │
└────┴───────┴────────────┴──────┘
┌─id─┬─name────┬──────cDate─┬─cost─┐
│ 1 │ wangben │ 2020-12-06 │ 44.4 │
└────┴─────────┴────────────┴──────┘
create table file_table(
name String ,
values UInt32
)engine=File(tablefile); 建表的时候指定一个文件名就在file后面的括号里
然后select这个表会返回一个路径在这个路径下建一个同名的表格式形同数据就会被倒过来
File /var/lib/clickhouse/data/db_dezhi/file_table///data.ta
关键字 | ClickHouse-local -q
echo -e 添加到-e是识别换行符
echo -e '1,'2'\n3,'4'' 把这个数据添加到下表里
--上面这一行如果换成 cat 加一个路径 就可以读这个路径的文件 如 cat /fata/a.CSV
| clickhouse-local -q 固定关键词 | 也要写
'create table tb_local_file( 创建表 '' 引号也要写
id Int8 ,
data String)
engine = File(CSV,stdin); 指定引擎和指定输入输出流0或stdin是输入,1或stdout是输出流
select * from tb_local_file' 也可以>>加文件名 把结果添加到一个文件里
上面这个操作是在虚拟机上进行的 CSV就是可读的格式
在CH中建表
create table tb_client(id UInt16 , name String) engine=TinyLog ;
将数据导入到CH表中
cat data.CSV | clickHouse-client -q "insert into db_doit19.tb_client FORMAT CSV";
– 在hive建表 指定表数据存储的格式 ORCFILE Parquet TextFile
—对应的在CH中支持 的输入的文件格式有 ORC Parquet CSV/TSV
– 将hive表中的数据直接加载到CH中
– 注意数据类型的匹配
集合数据类型的兼容性 array map struct
create table tb_teacher2(
name string ,
xz string ,
xx string
) stored as ORCFILE ; -- 在hive中建表指定数据存储格式
慧慧 处女座 B
老娜 射手座 A
奔奔 处女座 B
gangge 白羊座 A
taoge 射手座 A
insert into tb_teacher2 select * from tb_teacher ; -- 导入数据
tb_teacher是hive中本来就有的表加载到tb_teacher2 中用一下他的数据
/user/hive/warehouse/db_doit19.db/tb_teacher2/000000_0 ; -- 数据的位置在hdfs上的位置
-- 在CH中建表 指定引擎 HDFS引擎 和数据类型
create table tb_ch_teacher(
name String ,
xz String ,
xx String
) engine=HDFS("hdfs://linux01:8020/user/hive/warehouse/db_doit19.db/tb_teacher2/000000_0",ORC);
创建含有数组类型的表
create table tb_arr(
id Int8 ,
name String ,
hobby Array(String)
) engine = Log ;
添加数据
insert into tb_arr values(1,'wangben',['抽烟','喝酒','相亲']) ;
**file 文件必须在指定的路径下 /var/lib/clickhouse/user_files**
SELECT *
FROM file('user.csv', CSV, 'id Int8 , name String , age Int8 , gender String')
参数里面写文件名和文件的格式
-- clickhosue的配置文件的位置 默认在/etc/clickouse-server下
[root@linux01 clickhouse-server]# pwd
/etc/clickhouse-server
-rw-r--r--. 1 root root 33738 Oct 5 18:05 config.xml --
-rw-r--r--. 1 root root 5587 Oct 5 18:05 users.xml
进去该配置文件搜索user_files
从hdfs中from数据
hdfs
hdfs(URI, format, structure)
select * from hdfs("hdfs://linux01:8020/user/hive/warehouse/db_doit19.db/tb_teacher2/000000_0" ,ORC , 'name String , xz String , zzz String' )
SELECT *
FROM hdfs(`hdfs://linux01:8020/user/hive/warehouse/db_doit19.db/tb_teacher2/000000_0`, ORC, 'name String , xz String ,xx String')
– 注意特殊的列式存储的数据格式 , 字段是内置在数据中 , 定义structure 注意字段名和数据类型
(一定要解析有的字段)
直接从mysql中from数据
SELECT *
FROM mysql('linux01:3306', 'db_doit19', 'tb_user', 'root', 'root')
┌─id──────┬─name─────┬─age─┬───birthday─┐
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
└─────────┴──────────┴─────┴────────────┘
with 'uid0001' as v 返回查询id等于uid0001的信息
select * from tb_user where id = v ;
with的一个小用法把值拿过来用在这里相当于求平均值
with (select count(1) from tb_user) as cnt
select sum(age) / cnt from tb_user ;
┌─divide(sum(age), cnt)─┐
│ 24 │
└───────────────────────┘
这是一个有array的表
create table tb_arr_join(
id Int8 ,
arr Array(String)
)engine=Memory ;
insert into tb_arr_join values(1,['a1','a2']),(2,array('b1','b2','b3')) ;
┌─id─┬─arr──────────────┐
│ 1 │ ['a1','a2'] │
│ 2 │ ['b1','b2','b3'] │
└────┴──────────────────┘
select
id ,
arr
from
tb_arr_join
array join
arr ; --相当于 explode炸裂 + lateral view开个 id的窗口 就得到了下表的结果
┌─id─┬─arr─┐
│ 1 │ a1 │
│ 1 │ a2 │
│ 2 │ b1 │
│ 2 │ b2 │
│ 2 │ b3 │
└────┴─────┘
left array 就是如果数组中有没有数据的就用空补齐
select
id ,
arr
from
tb_arr_join
left array join
arr ; -- 默认覆盖原有的数组
元数据是有arr这个字段的现在join过了就把原来的字段覆盖了所以原来的数组字段就不显示了
select
id ,
arr ,
x1
from
tb_arr_join
left array join
arr as x1 ;
┌─id─┬─arr──────────────┬─x1─┐
│ 1 │ ['a1','a2'] │ a1 │
│ 1 │ ['a1','a2'] │ a2 │
│ 2 │ ['b1','b2','b3'] │ b1 │
│ 2 │ ['b1','b2','b3'] │ b2 │
│ 2 │ ['b1','b2','b3'] │ b3 │
└────┴──────────────────┴────┘
这边给arr取了个别名就不会覆盖原来的arr字段所以在这里就显示了
把表以变成表二的样子
┌─id─┬─name─┐
│ 1 │ a1 │
│ 1 │ a2 │
│ 1 │ a3 │
│ 2 │ b1 │
│ 2 │ b2 │
│ 2 │ b3 │
└────┴──────┘
┌─id─┬─e──┬─i─┐
│ 1 │ a1 │ 1 │
│ 1 │ a2 │ 2 │
│ 1 │ a3 │ 3 │
│ 2 │ b1 │ 1 │
│ 2 │ b2 │ 2 │
│ 2 │ b3 │ 3 │
└────┴────┴───┘
select
id ,e ,i
from
(
select
id ,
groupArray(name) arr , 把name这一列聚合
arrayEnumerate(arr) arr2 获得arr这一列的角标
from
tb_test_arr
group by id 通过id聚合
)
array join
arr as e ,
arr2 as i
;
distinct 去重
FORMAT 指定输出和输入的数据格式
clickhouse-client -q “select * from db_doit19.tb_user FORMAT XML”
limit n 显示前n条数据
desc limit n 显示后n条数据
select * from tb_user limit 2 ;
建一个表添加数据
create table tb_limit(
id Int8 ,
name String ,
score Float64
)engine=Log ;
insert into tb_limit values(1,'zss',77),(1,'zss',79),(1,'zss',99),(1,'zss',89) ;
insert into tb_limit values(2,'lss',66),(2,'lss',69),(2,'lss',61),(2,'lss',69) ;
select * from tb_limit order by score desc limit 2 by name;
通过limit by函数取前两个名字相同的数据
create view v_limit as select * from tb_limit ;建一个视图
create table t_limit engine-Log as select * from tb_limit ; 建一个一摸一样的表要指定引擎
create table tb_p(
oid String ,
money Float64 ,
cDate Date
) engine = MergeTree
order by oid
partition by cDate ; 指定分区字段
insert into tb_p values ('002',99,'2020-12-01') ,('001',98,'2020-12-01') ,('003',199,'2020-12-02');
查询到的表的样子 分成了两个表日期相同的在同一个表
┌─oid─┬─money─┬──────cDate─┐
│ 003 │ 199 │ 2020-12-02 │
└─────┴───────┴────────────┘
┌─oid─┬─money─┬──────cDate─┐
│ 001 │ 98 │ 2020-12-01 │
│ 002 │ 99 │ 2020-12-01 │
----------------------------
create table tb_p2(
oid String ,
money Float64 ,
cDate Date
) engine = MergeTree
order by oid
partition by toMonth(cDate) ;-- 月进行分区 用到了一个月的函数 得到的就是月份相同的在一个表
insert into tb_p2 values ('002',99,'2020-12-01') ,('001',98,'2020-12-01') ,('003',199,'2020-12-02'),('004',299,'2020-11-02');
create table tb_p3(
oid String ,
money Float64 ,
cDate Date
) engine = MergeTree
order by oid
partition by (toYear(cDate) , toMonth(cDate)) ;-- 年月进行分区
insert into tb_p3 values ('002',99,'2020-12-01') ,('001',98,'2020-12-01') ,('003',199,'2020-12-02'),('004',299,'2020-11-02'),('005',299,'2019-11-02')
;
得到的是年月相同的在同一个表 类似于多级分区
drwxr-x---. 2 clickhouse clickhouse 228 Dec 6 04:33 2019-11_3_3_0
drwxr-x---. 2 clickhouse clickhouse 228 Dec 6 04:33 2020-11_2_2_0
drwxr-x---. 2 clickhouse clickhouse 228 Dec 6 04:33 2020-12_1_1_0
但是与多级分区不同的是这个不是嵌套不是年里面套月 二十都是单独的文件夹