clickhouse数据导入遇到的问题

本文探讨了使用MyBatis和JDBC批量写入ClickHouse时遇到的性能瓶颈及解决方案,包括数据源选择、时间格式处理、主键与排序键设定、引擎参数配置、事务提交等问题,并分享了优化后的显著性能提升。

1. 采用mybatis写入数据,速度很慢的问题;

采用mybatis拼接sql的方式,可以写入数据,但是效率很低。每秒数据大概200-300条数据记录。

2. 采用jdbc写入数据,可以使用两种数据源

// 新版本的包
import com.clickhouse.jdbc.ClickHouseDataSource;

// 这个包可以
import ru.yandex.clickhouse.ClickHouseDataSource

3. 时间格式设置问题

组织批量写库时的日期时间格式问题。

java.sql.Date sqlPayTime = new java.sql.Date(bill.getPayTime().getTime());
prepareStatement.setObject(39, new Timestamp(sqlPayTime.getTime()));

需要使用sql的Timestamp,不能使用java.util.Date,也不能使用java.sql.Date。

 4. 主键和排序键

在创建表时指定主键,会根据主键创建索引;
主键可以是多个列,不会影响查询性能,而且主键相同的数据可以重复;
一般不指定主键(primary key),而是指定排序键(order by),此时会把排序键作为主键;
排序键和主键可以不同,但此时主键必须时排序键的前缀。

5. 引擎参数问题

CREATE TABLE default.bill
(
    `bill_id` Int64,
    `bill_date` DateTime
)
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(bill_date)
ORDER BY bill_date
SETTINGS index_granularity = 8192;

 这个引擎设置是有问题的。

当排序key相同的数据,在做数据合并的时候,会进行去重处理。如果bill_date相同,就会进行数据合并。

CREATE TABLE default.bill
(
    `bill_id` Int64,
    `bill_date` DateTime,
    `plat_billno` String
)
ENGINE = ReplacingMergeTree(bill_date)
PARTITION BY toYYYYMM(bill_date)
ORDER BY (plat_billno, bill_date)
PRIMA
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿20

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

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

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

打赏作者

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

抵扣说明:

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

余额充值