clickhouse 十三 (操作数据表)

本文介绍了ClickHouse中ALTER命令的使用,包括添加、删除和修改字段,以及清理和管理数据。针对大规模表的操作,建议使用脚本进行分布式处理以避免阻塞和提高效率。同时,提供了数据清理、分区管理和数据删除的示例,强调了在处理大表时的注意事项和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网描述:alter操作仅支持 *MergeTree ,Merge以及Distributed等引擎表。本示例采用支持数据副本的MergeTree做测试表,alter语句操作数据的会在压缩的情况下被复制

个人见解:在ck使用alter table on cluster语句的使用,alter语句会通过zk去调整各个ck分片的数据,所以就会有一种尴尬就是,操作大表的数据,alter on cluster语句就会阻塞着,速度很慢,如果此时ck集群有机器宕机,就会影响到整个表。最好的方式就是小表使用这种alter on cluster语句,而大表(上亿级别)自己使用脚本,轮询的到每个机器上alter表。
测试表:

CREATE TABLE test.tmp_uid_info
(
    `uid` Int32,
    `alias` Int32,
    `sex` String,
    `totalDate` Date,
    `source` String,
    `name` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/test/tables/{shard}/tmp_uid_info', '{replica}')
PARTITION BY totalDate
ORDER BY uid
SETTINGS index_granularity = 8192

添加新字段

#语法格式
alter table tb_name add column [IF NOT EXISTS] name [type] [default_expr]
[alter name_after]

# 给测试表的末尾增加新字段.,对于数据表中已经存在旧数据⽽⾔,新追加的字段会使⽤默认值补全
alter table default.tmp_uid_info_all on cluster ck_cluster add column age String default '0';

alter table default.tmp_uid_info on cluster ck_cluster add column age String default '0';

删除已有字段

# 语法格式
alter table tb_name drop column [IF EXISTS] name

# 删除测试表的age字段,注意字段被删除后,它的数据也会被连带删除
alter table default.tmp_uid_info_all on cluster ck_cluster drop column age;

alter table default.tmp_uid_info on cluster ck_cluster drop column age;

修改字段类型

# 语法格式
alter table tmp_uid_info MODIFY COLUMN [IF EXISTS] name [type] [default_expr]
# 修改uid的字段类型,由int32改成Int64,注意,使用String转成Int会报错
alter table default.tmp_uid_info_all on cluster ck_cluster modify column uid Int64;

alter table default.tmp_uid_info on cluster ck_cluster modify column uid Int64;

修改字段名

# 语法格式
ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name
# 修改uid的字段类型,由int32改成Int64,注意,使用String转成Int会报错
alter table tmp_uid_info on cluster ck_cluster rename column name to username;

给字段添加注释

# 语法格式
alter table tb_name comment column [IF EXISTS] name 'comment'

# 给测试表的name字段添加注释
 alter table default.tmp_uid_info on cluster ck_cluster comment column name '姓名'

# 即可查看到name的注释
DESCRIBE TABLE tmp_uid_info

┌─name──────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ uid       │ Int32  │              │                    │         │                  │                │
│ alias     │ Int32  │              │                    │         │                  │                │
│ sex       │ String │              │                    │         │                  │                │
│ totalDate │ Date   │              │                    │         │                  │                │
│ source    │ String │              │                    │         │                  │                │
│ name      │ String │              │                    │ 姓名    │                  │                │
│ age       │ String │ DEFAULT      │ '0'                │         │                  │                │
└───────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

清空数据表,只是表内的数据全部清空,⽽不是直接删除这张表

# 语法格式
truncate table [IF EXISTS] [db_name.]tb_name
# 清空测试表数据
truncate table default.tmp_uid_info on cluster ck_cluster

同步zk删除表

drop table if EXISTS default.ods_user_test on cluster ck_cluster sync;
drop table if EXISTS default.ods_user_test_all on cluster ck_cluster sync;

通过system系统库的Parts表来查询分区信息

SELECT 
    partition_id,
    name,
    table,
    database
FROM system.parts
WHERE (table = 'tmp_uid_info') AND (database = 'test')

┌─partition_id─┬─name─────────────┬─table────────┬─database─┐
│ 20101027     │ 20101027_0_0_0_2 │ tmp_uid_info │ test     │
│ 20121027     │ 20121027_0_0_0_2 │ tmp_uid_info │ test     │
│ 20131127     │ 20131127_0_0_0_2 │ tmp_uid_info │ test     │
│ 20141127     │ 20141127_0_0_0_2 │ tmp_uid_info │ test     │
│ 20161027     │ 20161027_0_0_0_2 │ tmp_uid_info │ test     │
│ 20161127     │ 20161127_0_0_0_2 │ tmp_uid_info │ test     │
│ 20171127     │ 20171127_0_0_0_2 │ tmp_uid_info │ test     │
│ 20180127     │ 20180127_0_0_0_2 │ tmp_uid_info │ test     │
│ 20181027     │ 20181027_2_2_0_4 │ tmp_uid_info │ test     │
│ 20181227     │ 20181227_0_0_0_2 │ tmp_uid_info │ test     │
│ 20190127     │ 20190127_0_0_0_2 │ tmp_uid_info │ test     │
│ 20190227     │ 20190227_0_0_0_2 │ tmp_uid_info │ test     │
│ 20191027     │ 20191027_2_2_0_4 │ tmp_uid_info │ test     │
│ 20191127     │ 20191127_0_0_0_2 │ tmp_uid_info │ test     │
│ 20201027     │ 20201027_0_0_0_2 │ tmp_uid_info │ test     │
└──────────────┴──────────────────┴──────────────┴──────────┘

根据条件删除测试表的数据:

alter table default.tmp_uid_info on cluster ck_cluster delete
where totalDate='2020-10-28'

根据分区删除测试表的数据:

# 根据分区键删除,测试表按日期分区
alter table default.tmp_uid_info on cluster ck_cluster drop partition '2020-10-27'

手动合并数据表的分区

# 单机
optimize table default.tmp_uid_info partition '2020-10-27' final
# zk分发
optimize table default.tmp_uid_info on cluster ck_cluster partition '2020-10-27' final

修改表名字

rename table database.table1 to database.table2 on cluster ck_cluster;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高并发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值