clickhouse插入数据

clickhouse中插入数据,最好性能是按照指定格式插入文件,这样是ck擅长的,因为ck是写入block的,每个block的大小在配置文件中设置有,这样在数据未写满block的时候,要么写成功要么写失败,不能部分成功。
ck写入没有写满block的时候的原子性,只有在只有在ClickHouse服务端处理数据的时候才具有这种原子写入的特性,例如使用JDBC或者HTTP接口时

4.4.1 插入数据
INSERT语句支持三种语法范式,三种范式各有不同,可以根据写入的需求灵活运用。
4.4.1.1 第一种方式
使用VALUES格式的常规语法:
INSERT INTO [db.]table [(c1, c2, c3…)] VALUES (v11, v12, v13…), (v21, v22, v23…), …
其中,c1、c2、c3是列字段声明,可省略。VALUES后紧跟的是由元组组成的待写入数据,通过下标位与列字段声明一一对应。数据支持批量声明写入,多行数据之间使用逗号分隔。例如执行下面的语句,将批量写入多条数据:
insert into log values(1,‘2021-04-21 00:00:00’),(2,‘2021-05-22 00:00:00’),(3,‘2021-05-23 00:00:00’),(4,‘2021-04-21 00:00:00’);
insert into log values(1,‘2021-05-21 00:00:00’);
4.4.1.2 第二种方式
使用指定格式的语法:
INSERT INTO [db.]table [(c1, c2, c3…)] FORMAT format_name data_set
cat data.tsv | clickhouse-client -q ‘insert into test_db.log1 format TSV’
clickhouse-client --format_csv_delimiter=“,” --query=“INSERT INTO tb_client FORMAT CSV” < ./app.csv
示例:
静态数据: cat user.txt
1,zss,23,BJ,M
2,lss,33,NJ,M
3,ww,21,SH,F
create table test_load1(
id UInt8 ,
name String ,
age UInt8 ,
city String ,
gender String
)engine=Log ;
– 将数据导入到表中
cat user.txt | clickhouse-client -q ‘insert into default.test_load1 format CSV’
clickhouse-client -q ‘insert into default.test_load1 format CSV’ < user.txt
上面的两种方式都可以将数据导入到表中
– 我们还可以执行数据行属性的分割符
clickhouse-client --format_csv_delimiter=‘,’ -q ‘insert into default.test_load1 format CSV’ < user.txt
4.4.1.3 第三种方式
使用SELECT子句形式的语法:
INSERT INTO [db.]table [(c1, c2, c3…)] SELECT …
虽然VALUES和SELECT子句的形式都支持声明表达式或函数,但是表达式和函数会带来额外的性能开销,从而导致写入性能的下降。所以如果追求极致的写入性能,就应该尽可能避免使用它们。
Create table log3 as log2 ;
Insert into log3 select * from log2 ;
ClickHouse内部所有的数据操作都是面向Block数据块的,所以INSERT查询最终会将数据转换为Block数据块。也正因如此,INSERT语句在单个数据块的写入过程中是具有原子性的。在默认的情况下,每个数据块最多可以写入1048576行数据(由max_insert_block_size参数控制)。也就是说,如果一条INSERT语句写入的数据少于max_insert_block_size行,那么这批数据的写入是具有原子性的,即要么全部成功,要么全部失败。需要注意的是,只有在ClickHouse服务端处理数据的时候才具有这种原子写入的特性,例如使用JDBC或者HTTP接口时。因为max_insert_block_size参数在使用CLI命令行或者INSERT SELECT子句写入时是不生效的。

你可能感兴趣的:(clickhouse,java,前端)