Clickhouse使用基础
# 查看操作系统版本
cat /etc/os-release
# clickhouse版本
clickhouse -V
# 登录clickhouse客户端
clickhouse-client -u xxx --password xxx -m
# -m 或 --multiline:进入客户端后,运行输入多行sql语句
建表
# 创建数据库
CREATE DATABASE IF NOT EXISTS test; --使用默认库引擎创建库
# 创建本地表
create table IF NOT EXISTS test.user_table (
uid String comment '用户ID',
sex String comment '性别',
age UInt16 comment '年龄',
phone String comment '联系电话'
)
engine = MergeTree()
order by uid;
- 数据类型需要大写开头:String、UInt16
- 表引擎类型也必须大写MergeTree
- 如果没有指定主键,默认使用 order by 指定的字段
# 创建分布式表
-- 在集群中创建实际存放数据的本地表
create table test.user_event on cluster data_cluster(
uid String comment '用户id',
event String comment '事件名称',
c_time DateTime comment '点击时间',
dt Date comment '日期'
)
engine = MergeTree()
partition by dt
order by uid;
--创建分布式表
create table test.user_event_distributed (
uid String comment '用户id',
eventString comment '事件名称',
c_time DateTime comment '点击时间',
dt Date comment '日期'
)
engine = Distributed('data_cluster', 'test', 'user_event', rand());
- 分布式表需要选择Distributed 表引擎:
- 第1个参数:集群名称
- 第2个参数:数据库名
- 第3个参数:数据表名
- 第4个参数:分片key,数据被到不同服务器依据的字段,相同的值会被分配到同一台服务器
如果在创建分布式表test.user_event_distributed 时没有指定on cluster data_cluster,那么创建是本地表,后续的查询只能在建表的那个节点服务器查询数据
表变更
# 删除特定分区
alter table test.user_event
on cluster data_cluster
drop partition '2024-11-30';
alter table test.user_event
on cluster data_cluster
delete where dt > '2024-11-15';
alter table test.user_event
on cluster data_cluster
delete where dt='2024-11-30';
# 删除满足特定条件数据
alter table test.user_event
on cluster data_cluster
delete where user_id='u00001';
自定义函数
/**
* 创建自定义函数 x_split
* 分割字符串并把类型转换为整数
*/
CREATE FUNCTION x_split (x String)
RETURNS Array(UInt32)
AS
(
arrayMap(
(y) -> toUInt32(y),
splitByString(',', x)
)
);