Java和Python操作Clickhouse

clickhouse版本:21.8.12.1,Java版本:jdk1.8,Python版本:Python2或者3

Java操作clickhouse

官方文档地址:https://clickhouse.com/docs/zh/interfaces/jdbc

  1. 需要的pom依赖:
<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.3.1-patch</version>
    <classifier>shaded</classifier>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
  1. 获取连接
private static Connection connectionCK = null;
static {
    try {
        Class.forName("ru.yandex.clickhouse.ClickHouseDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    try {
        connectionCK = DriverManager.getConnection("jdbc:clickhouse://192.168.1.1:8123/test");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

操作跟java操作Mysql类似,默认情况下,clickhouse-server会在8123端口上监控HTTP请求。

  1. 查询与插入、更新
String sqlCK = "insert into test values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
PreparedStatement psCK = null;
psCK = connectionCK.prepareStatement(sqlCK);
for(...) {
    psCK.set(...);
    psCK.addBatch();
}
// 批量插入
psCK.executeBatch();

由于clickhouse逐条插入,后台需要频繁合并数据文件,效率不高,推荐批量插入,跟java批量插入mysql操作一样。在我们的腾讯云clickhouse上面,逐条插入每秒20条左右,批量插入每秒5万条数据左右。

Python操作clickhouse

  1. 需要的依赖
from clickhouse_driver import Client

安装用pip命令:

pip install clickhouse_driver
  1. 获取连接
clientCK = Client(host='192.168.1.2', port=9000,database='test',password='password')

python连接clickhouse用的是tcp协议走的9000端口,这里跟java有点不同。

  1. DDL / DML
result = clientCK.execute(sql)

如果是查询,结果是[(), ()…],二维数据,最外面一层是list,里面元祖。拿到结果通常要判断一下len(result),如果是0,表名结果为空,否则可以进行后续的处理了,避免数组下标越界。

发布日期:

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注