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

相关推荐
bluceli几秒前
JavaScript WeakMap与WeakSet:内存优化的秘密武器
前端·javascript
代码探秘者几秒前
【Java集合】ArrayList :底层原理、数组互转与扩容计算
java·开发语言·jvm·数据库·后端·python·算法
寻见9031 分钟前
10 分钟吃透 MyBatis 核心|从底层原理到实战技巧,Java 开发者必藏(无废话干货)
java·mysql·mybatis
陆枫Larry1 分钟前
折叠屏“窗口化”下的全屏背景图错位:一次小程序适配的排障思路与最小改动修复
前端
隔壁小邓2 分钟前
分布式事务
java·后端
陆枫Larry2 分钟前
Art Direction(艺术导向适配)
前端
Lee川4 分钟前
从“手工砌砖”到“魔法蓝图”:响应式驱动界面的诞生与实战
前端·vue.js
与虾牵手4 分钟前
Next.js 14 App Router 踩坑实录:5 个让我加班到凌晨的坑 🕳️
前端·javascript·面试
猩球中的木子5 分钟前
怎么集成安装VitePlus(Vite+)并使用
前端·vite·前端工程化
李昊哲小课8 分钟前
电商系统项目教程
开发语言·前端·javascript