clickhouse--SummingMergeTree() 表函数加载数据 array join HDFS引擎集成hdfs和hive文件

一. 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 │
└─────┴───────┴────────────┘

 

你可能感兴趣的:(clickhouse)