一. SummingMergeTree(cost) --将区内相同主键的所有的数据累加,合并之后cost会直接返回和
create table tb_summ_merge_tree(
id Int8,
name String,
cDate Date,
cost Float64
)
engine=SummingMergeTree(cost)
order by id --id排序
partition by name --name分区
primary by id; --id作为主键
insert into tb_summ_merge_tree values(1,'zss',2020-12-05,69.99),(1,'lss',2020-12-05,6.9);
insert into tb_summ_merge_tree values(2,'zss',2020-12-05,99.99),(2,'lss',2020-12-05,9.9);
┌─id─┬─name─┬──────cDate─┬──cost─┐
│ 2 │ zss │ 1975-06-27 │ 99.99 │
│ 2 │ lss │ 1975-06-27 │ 9.9 │
└────┴──────┴────────────┴───────┘
┌─id─┬─name─┬──────cDate─┬──cost─┐
│ 1 │ zss │ 1975-06-27 │ 69.99 │
│ 1 │ lss │ 1975-06-27 │ 6.9 │
└────┴──────┴────────────┴───────┘
optimize table tb_summ_merge_tree;
┌─id─┬─name─┬──────cDate─┬───cost─┐
│ 1 │ zss │ 1975-06-27 │ 76.89 │
│ 2 │ zss │ 1975-06-27 │ 109.89 │
└────┴──────┴────────────┴────────┘
二. Decimal64(n) --指定小数点后n位
create table tb_decimal(
id Int8,
money Decimal64(3) --指定小数点后3位,不会四舍五入
)
engine=Log;
insert into tb_decimal values(1,9);
┌─id─┬─money─┐
│ 1 │ 9.000 │
└────┴───────┘
insert into tb_decimal values(2,9.99);
┌─id─┬─money─┐
│ 1 │ 9.000 │
└────┴───────┘
┌─id─┬─money─┐
│ 2 │ 9.990 │
└────┴───────┘
三. 数据导入
全量数据导入,数据导入临时表->导入完成后,将原标改名为tmpl->将临时表改名为正式表->删除原表
增量数据导入,增量数据导入临时表->将元数据出增量外的也导入临时表->导入完成后,将原表改名为tmpl->将临时表改名为正式表->删除元数据表
clickhouse-click
格式
Cat file | clickhouse-clinet -q "inset into FORMAT CSV"
--将本地的数据存储在ch的表中
--在CH中建表
create table tb_client(id UInt16 , name String) engine=TinyLog ;
--将数据导入到CH表中
cat data.csv | clickhouse-client -q "INSERT INTO db_name.tb_client FORMAT CSV"; --db_name是指定数据库
四. HDFS引擎集成hdfs文件和hive
2. HDFS
导入HDFS中的文件数据到表中
可以是HDFS和本地的文件数据
ENGINE = HDFS(URI, format)
1 zss 北京 24
2 lss 北京 21
3 wb 上海 27
drop table tb_user ;
create table tb_user(
id Int32 ,
name String ,
city String ,
age UInt8
)
engine=HDFS("hdfs://linux01:8020/clickhouse/user.tsv" ,TSV) ;
3. hive
在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中建表指定数据存储格式
insert into tb_teacher2 select * from tb_teacher ; -- 将teacher中的数据导入
/user/hive/warehouse/db_name.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_name.db/tb_teacher2/000000_0",ORC);
五. 表函数加载数据
1. from --从其他的数据中读取数据(功能强大)
1) file 文件必须在指定的路径下 /user_files
--file() 参数一:文件路径 参数二:分隔符格式 参数三数据属性
select
*
from
file('/user_files/user.csv' , TSV , 'id Int8 , name String , age Int8 , gender String'); --CSV是, TSV是空格
┌─id─┬─name─┬─age─┬─gender─┐
│ 1 │ a │ 23 │ M │
│ 2 │ b │ 24 │ F │
└────┴──────┴─────┴────────┘
2)hdfs(URI, format, structure) 参数一hdfs文件路径 参数二格式 参数三文件数据属性
select
*
from
hdfs("hdfs://linux01:8020/user/hive/warehouse/db_name.db/tb_teacher2/000000_0" ,ORC , 'name String , xx String , xz String' );
-- 注意特殊的列式存储的数据格式 , 字段是内置在数据中 , 定义structure 注意字段名和数据类型
--(一定要解析有的字段)
┌─name───┬─xz─────┬─xx─┐
│ 慧慧 │ 处女座 │ B │
│ 老娜 │ 射手座 │ A │
│ 奔奔 │ 处女座 │ B │
│ gangge │ 白羊座 │ A │
│ taoge │ 射手座 │ A │
└────────┴────────┴────┘
3)mysql(主机位置 , 数据库名 , 表名 , 用户名 , 密码)
SELECT *
FROM mysql('linux01:3306', 'db_doit', 'tb_user', 'root', 'root')
┌─id─┬─name─┐
│ 1 │ zss │
│ 2 │ lss │
│ 1 │ zss │
│ 2 │ lss │
│ 3 │ www │
│ 1 │ A │
│ 2 │ B │
│ 3 │ C │
└────┴──────┘
六. with
┌─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
select * from tb_user where id = v ;
┌─id──────┬─name────┬─age─┬───birthday─┐
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
└─────────┴─────────┴─────┴────────────┘
with (select count(1) from tb_user) as cnt
select sum(age) / cnt from tb_user ;
┌─divide(sum(age), cnt)─┐
│ 24 │
└───────────────────────┘
七. array join
create table tb_arr_join(
id Int8 ,
arr Array(String) --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 -- 类似于explode + lateral view 将数组炸裂开
arr ;
┌─id─┬─arr─┐
│ 1 │ a1 │
│ 1 │ a2 │
│ 2 │ b1 │
│ 2 │ b2 │
│ 2 │ b3 │
└────┴─────┘
insert into tb_arr_join values(3,[]); --插入一个空数组数据
select
id ,
arr
from
tb_arr_join
left array join
arr ; -- 默认覆盖原有的数组,空数组也会显示出来
┌─id─┬─arr─┐
│ 1 │ a1 │
│ 1 │ a2 │
│ 2 │ b1 │
│ 2 │ b2 │
│ 2 │ b3 │
└────┴─────┘
┌─id─┬─arr─┐
│ 3 │ │
└────┴─────┘
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 │
└────┴──────────────────┴────┘
┌─id─┬─arr─┬─x1─┐
│ 3 │ [] │ │
└────┴─────┴────┘
select
id , arr
from
tb_arr_join
array join
[1,2,3,4,5] as x; --把下面的数组拆开和上面的数组拼接
┌─id─┬─arr──────────────┬─x─┐
│ 1 │ ['a1','a2'] │ 1 │
│ 1 │ ['a1','a2'] │ 2 │
│ 1 │ ['a1','a2'] │ 3 │
│ 1 │ ['a1','a2'] │ 4 │
│ 1 │ ['a1','a2'] │ 5 │
│ 2 │ ['b1','b2','b3'] │ 1 │
│ 2 │ ['b1','b2','b3'] │ 2 │
│ 2 │ ['b1','b2','b3'] │ 3 │
│ 2 │ ['b1','b2','b3'] │ 4 │
│ 2 │ ['b1','b2','b3'] │ 5 │
└────┴──────────────────┴───┘
┌─id─┬─arr─┬─x─┐
│ 3 │ [] │ 1 │
│ 3 │ [] │ 2 │
│ 3 │ [] │ 3 │
│ 3 │ [] │ 4 │
│ 3 │ [] │ 5 │
└────┴─────┴───┘
create table tb_test_arr(
id Int8 ,
name String
)engine = Log ;
insert into tb_test_arr values(1,'a1'),(1,'a2'),(1,'a3'),(2,'b1'),(2,'b2'),(2,'b3') ;
┌─id─┬─name─┐
│ 1 │ a1 │
│ 1 │ a2 │
│ 1 │ a3 │
│ 2 │ b1 │
│ 2 │ b2 │
│ 2 │ b3 │
└────┴──────┘
select
id ,
groupArray(name) arr --groupArray(name) 把name转成数组
from
tb_test_arr
group by id;
┌─id─┬─groupArray(name)─┐
│ 1 │ ['a1','a2','a3'] │
│ 2 │ ['b1','b2','b3'] │
└────┴──────────────────┘
select
id ,
groupArray(name) arr ,
arrayEnumerate(arr) arr_index --name的角标
from
tb_test_arr
group by id;
┌─id─┬─arr──────────────┬─arrayEnumerate(groupArray(name))─┐
│ 1 │ ['a1','a2','a3'] │ [1,2,3] │
│ 2 │ ['b1','b2','b3'] │ [1,2,3] │
└────┴──────────────────┴──────────────────────────────────┘
八. limit n 前n条数据
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) ;
┌─id─┬─name─┬─score─┐
│ 1 │ zss │ 77 │
│ 1 │ zss │ 79 │
│ 1 │ zss │ 99 │
│ 1 │ zss │ 89 │
└────┴──────┴───────┘
┌─id─┬─name─┬─score─┐
│ 2 │ lss │ 66 │
│ 2 │ lss │ 69 │
│ 2 │ lss │ 61 │
│ 2 │ lss │ 69 │
└────┴──────┴───────┘
select * from tb_limit order by score desc limit 2 by name; --取name前两个最高分
┌─id─┬─name─┬─score─┐
│ 1 │ zss │ 99 │
│ 1 │ zss │ 89 │
└────┴──────┴───────┘
┌─id─┬─name─┬─score─┐
│ 2 │ lss │ 69 │
│ 2 │ lss │ 69 │
└────┴──────┴───────┘
create view v_limit as select * from tb_limit ; --复制了tb_limit的数据新建了v_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) ; --toMonth月进行分区
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');
┌─oid─┬─money─┬──────cDate─┐
│ 001 │ 98 │ 2020-12-01 │
│ 002 │ 99 │ 2020-12-01 │
│ 003 │ 199 │ 2020-12-02 │
└─────┴───────┴────────────┘
┌─oid─┬─money─┬──────cDate─┐
│ 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');
┌─oid─┬─money─┬──────cDate─┐
│ 001 │ 98 │ 2020-12-01 │
│ 002 │ 99 │ 2020-12-01 │
│ 003 │ 199 │ 2020-12-02 │
└─────┴───────┴────────────┘
┌─oid─┬─money─┬──────cDate─┐
│ 004 │ 299 │ 2020-11-02 │
└─────┴───────┴────────────┘
┌─oid─┬─money─┬──────cDate─┐
│ 005 │ 299 │ 2019-11-02 │
└─────┴───────┴────────────┘