clickhouse 相关笔记以及经验
- 建议使用clickhouse http interface, 其自由度更高,但是需要自己对数据做一定的预处理;
- insert数据时建议使用values或者JSONEachRow格式,批量插入(每批1000条,平均每条2k)时values格式耗时0.04s,JSONEachRow格式耗时0.06s;
- insert时采用values格式插入需要提前对数据做转义,可以参考escape.py中方法
- insert数据时建议使用values或者JSONEachRow格式,批量插入(每批1000条,平均每条2k)时values格式耗时0.04s,JSONEachRow格式耗时0.06s;
- insert批量插入(每批1000条,平均每条2k)到非Replicated本地表时耗时0.04s,插入到Replicated本地表时耗时0.3s;插入Replicated表时需要有ZK相关协调等
- 参见 stat.sql
问题:创建分布式复制表时由于字段命名错误等想通过删除表后重建新表,在删除旧表后,如果立即新建新表提示ZK中相关路径已经存在无法新建
临时方法:等待一定时间等clickhouse将zk中表相关元数据等删除后在创建,等待时间未知
尝试过:手动将zk中数据删除,结果导致clickhouse异常
解决方法:
1、建表时指定使用不同的zk路径
2、drop table no delay | sync
3、调低 database_atomic_wait_for_drop_and_detach_synchronously
DROP TABLE table_name ON cluster cluster_name
查找分区
SELECT distinct(partition)
FROM system.parts
WHERE database='target_database' and table = 'target_table';
ALTER TABLE 'target_table' ON CLUSTER 'cluster_name' DROP PARTITION 'partition_name'
SELECT * FROM system.clusters FORMAT Vertical;
已存在如果要修改order by则无法添加已存在字段 必须是在alter中add column的新列;
给大表修改order by,可以先将数据导出到本地,然后删表、重新创建表,在把数据导入到表中;
方法一 导入导出:
# export 默认格式为 TabSeparated;可以通过FORMAT 指定
clickhouse-client --port port -d database_name -q "select * from table_name " > xxx
# import
clickhouse-client --port port -d database_name -q "insert into table_name FORMAT TabSeparated" < xxx
方法二 insert select 【未尝试 估计server压力大 不适合大表】:
insert into table_name select * from table_name2