clickhouse的傻瓜式安装和基础入门

clickhouse的傻瓜式安装

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语言编写
引擎就是表的类型,不同的表有不同的特点,数据存储的位置,决定了表的操作行为.

clickhouse的基本操作命令

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引擎    这个引擎没用了解一下

数据存储在本地默认位置

  • 数据是以列为文件存储
  • 插入数据的时候是向文件后面追加数据
  • xx.bin 列数据
  • _marks.mrk 数据的块偏移量
  • sizes.json 长度每个文件的大小
向表中插入数据
insert into tb_user values('uid0002','wanggang',21,'1999-03-08');

MergeTree 引擎

MergerTree引擎底层存储数据以Tree基本存储结构

  • 维护节点关系 方便分区
  • 方便CRUD 增删改查
  • 排序 方便索引
  • 合并(归并) 他自己也会定时合并
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');

ReplacingMergeTree 引擎

建表

去重主键相同的数据   保留v版本大的数据    删除操作发生在合并时
create  table  tb_replacing_tree(
id String ,
name String ,
v UInt8
)
engine =  ReplacingMergeTree(v)     指定引擎并且指定版本号为V
primary key id        指定主键
order by ctime;      指定排序

CollapsingMergeTree 引擎

解决  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)  ;

VersionedCollapsingMergeTree 引擎 ****

指定删除数据的版本 

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 – 表引擎

先在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 — 表引擎

在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 引擎

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-0616.8 │
└────┴───────┴────────────┴──────┘
┌─id─┬─name────┬──────cDate─┬─cost─┐
│  1 │ wangben │ 2020-12-0644.4 │
└────┴─────────┴────────────┴──────┘

file 引擎

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 指定去读一个路径的文件引擎

关键字 | 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就是可读的格式

TinyLog 引擎 将本地的数据存储在ch的表中

在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中的文件加载到CH中

– 在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);

Array – 数组类型

创建含有数组类型的表
 create  table  tb_arr(
id Int8 ,
name String ,
hobby  Array(String)
) engine = Log ;
添加数据
insert  into tb_arr values(1,'wangben',['抽烟','喝酒','相亲']) ;

— from 从其他的数据中读取数据

**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')

– with 已知一个字段的内容查询

┌─id──────┬─name─────┬─age─┬───birthday─┐
│ uid0001 │ wangben  │  271994-02-02 │
│ uid0002 │ wanggang │  211999-03-08 │
│ uid0001 │ wangben  │  271994-02-02 │
│ uid0002 │ wanggang │  211999-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 join 炸裂数组窗口函数

这是一个有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 ;

limit by 函数

建一个表添加数据
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─┐
│ 0031992020-12-02 │
└─────┴───────┴────────────┘
┌─oid─┬─money─┬──────cDate─┐
│ 001982020-12-01 │
│ 002992020-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
 但是与多级分区不同的是这个不是嵌套不是年里面套月  二十都是单独的文件夹

你可能感兴趣的:(clickhouse的傻瓜式安装和基础入门)