clickhouse 十三 (操作数据表)

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

官网描述: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: 你可以使用 clickhouse-client 命令行工具来导入数据到 ClickHouse 本地表。 示例: ``` $ clickhouse-client --query="INSERT INTO table_name (column1, column2, ...) VALUES ('value1', 'value2', ...)" ``` 你也可以使用 clickhouse-client 命令行工具的复制命令来从本地文件或远程服务器导入数据。 示例: ``` $ clickhouse-client --query="COPY table_name FROM '/path/to/local/file.txt' FORMAT CSV" ``` ``` $ clickhouse-client --query="COPY table_name FROM 'http://remote.server/file.txt' FORMAT CSV" ``` 需要注意,导入数据时要确保指定的列名与表的列顺序相同,否则可能会出现错误。 ### 回答2: 要在ClickHouse中导入本地表数据,可以使用以下步骤: 1. 创建相应的数据库和表结构:在ClickHouse中创建与本地表结构相匹配的数据库和表。可以使用ClickHouse的CREATE DATABASE和CREATE TABLE语句来创建。 2. 导出本地表数据:在本地数据库中导出表数据为适当的格式,例如CSV、JSON或TSV。 3. 将导出的数据文件上传到ClickHouse服务器:使用适当的方法将导出的数据文件上传到ClickHouse服务器。可以使用scp命令或其他文件传输工具来完成。 4. 使用ClickHouse的数据导入工具导入数据:在ClickHouse服务器上使用ClickHouse的数据导入工具来导入数据文件。可以使用clickhouse-client命令和--query参数来执行INSERT语句或使用clickhouse-local命令来直接读取数据文件。 例如,假设有一个名为"mydb"的数据库和一个名为"mytable"的表,可以按照以下步骤导入数据: 1. 在ClickHouse中创建数据库: ``` CREATE DATABASE mydb; ``` 2. 在ClickHouse中创建表结构: ``` CREATE TABLE mydb.mytable (column1 Int32, column2 String, column3 Date) ENGINE = MergeTree() ORDER BY column1; ``` 3. 导出本地表数据为CSV文件。 4. 上传CSV文件到ClickHouse服务器的某个目录。 5. 使用ClickHouse的数据导入工具导入数据: ``` clickhouse-client --query "INSERT INTO mydb.mytable FORMAT CSV" --input_format_allow_errors_ratio=0.05 --input_format_allow_errors_num=10 < /path/to/data.csv ``` 其中,--query参数指定了插入数据的查询,--input_format_allow_errors_ratio和--input_format_allow_errors_num参数用于处理数据导入中的错误或异常情况。 以上就是使用ClickHouse导入本地表数据的简单步骤。 ### 回答3: 要将本地表数据导入clickhouse,需要进行以下步骤: 1. 首先,确保已经安装并配置了clickhouse数据库。可以通过在终端运行`clickhouse-client`命令来验证是否成功安装和配置。 2. 在本地表所在的数据库服务器上,进入clickhouse所在的服务器。 3. 在clickhouse服务器上创建一个新的数据库,用于存储导入的表数据。可以使用`CREATE DATABASE`命令来创建数据库。 4. 使用clickhouse的`LOCAL`关键字来导入本地表数据。导入数据的命令如下所示: ``` INSERT INTO <目标表名> (<列名列表>) FORMAT CSV <本地表数据文件路径> ``` 其中,`<目标表名>`是要导入数据的点击表名,`<列名列表>`是要导入数据的列名列表,`<本地表数据文件路径>`是指向包含要导入的本地表数据的CSV文件的路径。 例如,要将本地表数据导入名为`my_table`的clickhouse表中,命令如下所示: ``` INSERT INTO my_table (col1, col2, col3) FORMAT CSV '/path/to/local_table_data.csv' ``` 请确保指定的列名与本地表中的列名相匹配。 5. 执行上述命令后,clickhouse将会读取CSV文件中的数据,并将其插入到指定的表中。 6. 导入完成后,可以使用clickhouse的查询语句来验证数据是否成功导入。 注意:导入表数据的命令只能在clickhouse服务器上运行,不能在本地执行。如果需要在本地执行导入操作,可以使用clickhouse的远程连接功能,将本地文件传输到clickhouse服务器上,并在服务器上执行导入命令。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

高并发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值