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子句写入时是不生效的。

相关推荐
凡人叶枫18 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
飞天狗11118 小时前
零基础JavaWeb入门——第2课:让网页“活”起来 —— JSP是什么?
java·开发语言·前端·后端·web
梦@_@境19 小时前
面向 Spring Boot 的可观测业务流程编排引擎
java·spring boot·后端
云烟成雨TD19 小时前
Spring AI Alibaba 1.x 系列【77】执行取消
java·人工智能·spring
醇氧19 小时前
【Linux】Java 服务生产级部署指南:实现常驻后台、开机自启与系统服务化管理
java·开发语言
回忆2012初秋19 小时前
【Nginx】优雅地走进高性能 Web 服务器世界(1)
服务器·前端·nginx
kyriewen19 小时前
Claude Code Token 烧太快?实测 5 招,把月费从 250 美金砍到 50 美金
前端·ai编程·claude
JAVA面经实录91719 小时前
Netty 全套系统化学习文档(零基础到高阶面试完整版)
java·后端
weixin_5231853219 小时前
Java面试高频题:Integer缓存机制与 equals、== 区别
java·缓存·面试