【Clickhouse从入门到精通】第10篇:ClickHouse客户端访问与连接详解

上一篇【第09篇】ClickHouse安装部署全攻略——从环境准备到服务启动
下一篇【第11篇】ClickHouse内置工具实战——clickhouse-local与clickhouse-benchmark


摘要

ClickHouse支持多种客户端访问方式,包括原生的CLI命令行工具、JDBC/ODBC驱动、多语言的Driver库以及HTTP接口。本文全面介绍了ClickHouse的各种客户端连接方式,详细讲解了每种方式的使用方法、参数配置、代码示例和适用场景,帮助开发者根据不同的业务需求选择最适合的连接方式。同时,文章还介绍了MySQL协议兼容接口和第三方BI工具的连接配置,为构建完整的ClickHouse数据应用提供全面指导。

关键词:ClickHouse客户端、JDBC连接、Python Driver、HTTP接口、MySQL协议、BI工具连接


1 引言

ClickHouse作为分析型数据库,需要从多种渠道接收数据查询和写入请求。为了满足不同开发者的需求,ClickHouse提供了丰富的客户端访问方式。既有适合DBA操作的高效CLI工具,也有适合应用集成的JDBC驱动和HTTP接口,还有兼容MySQL协议的特殊接口。本文将系统性地介绍这些访问方式的特点、使用方法和最佳实践。

2 CLI命令行客户端

2.1 clickhouse-client基础用法

clickhouse-client是ClickHouse官方提供的命令行客户端工具,是DBA日常管理最常用的工具。

基本连接语法

# 基本连接(使用默认参数)
clickhouse-client

# 指定主机和端口
clickhouse-client --host 192.168.1.100 --port 9000

# 指定用户和密码
clickhouse-client --user default --password my_password

# 连接指定数据库
clickhouse-client --database mydb

# 组合参数
clickhouse-client -h 192.168.1.100 -p 9000 -u admin --password secret -d mydb

常用参数说明

参数 简写 说明 示例
–host -h ClickHouse服务器地址 –host 192.168.1.100
–port -p 连接端口(默认9000) –port 9000
–user -u 用户名(默认default) –user admin
–password -P 密码 –password secret
–database -d 默认数据库 –database mydb
–query -q 执行单个查询 -q “SELECT 1”
–queries-file -qf 从文件读取查询 –queries-file /tmp/query.sql
–format -f 输出格式 –format JSON
–time -t 显示查询执行时间 –time
–stacktrace 显示错误堆栈 –stacktrace
–progress 显示进度条 –progress
–multiquery -n 允许多查询(分号分隔) –multiquery

2.2 交互式模式与批处理模式

clickhouse-client支持两种工作模式:交互式模式和批处理模式。

交互式模式

# 进入交互式界面
clickhouse-client

# 界面示例:
# ClickHouse client version 22.8.2.2.
# Connecting to localhost:9000 as user default.
# Connected to ClickHouse server version 22.8.2.2.
#
# smiley-clickhouse :)

# 执行查询
smile:) SELECT 1
# ┌───1─┐
# │  1  │
# └───┘

# 多行查询
smile:) SELECT
smile:)     number,
smile:)     number * 2 AS doubled
smile:) FROM system.numbers
smile:) LIMIT 5
# ┌─number─┬─doubled─┐
# │      0 │       0 │
# │      1 │       2 │
# │      2 │       4 │
# │      3 │       6 │
# │      4 │       8 │
# └────────┴─────────┘

# 退出
smile:) EXIT
# 或 Ctrl+D

批处理模式(单行查询)

# 执行单个查询并退出
clickhouse-client -q "SELECT 1"

# 执行查询并显示时间
clickhouse-client -t -q "SELECT count() FROM system.numbers_mt(10000000)"

# 查询结果
# 10000000
# Elapsed: 0.052 sec.

批处理模式(多行查询)

# 使用分号分隔多个查询
clickhouse-client -q "SELECT 1; SELECT 2; SELECT 3"

# 使用-multiquery参数
clickhouse-client --multiquery -q "
CREATE TABLE IF NOT EXISTS test (
    id UInt32,
    name String,
    created_at DateTime
) ENGINE = MergeTree()
ORDER BY id;

INSERT INTO test VALUES (1, 'Alice', now());

SELECT * FROM test;
"

从文件执行查询

# 创建查询文件
cat > /tmp/query.sql << 'EOF'
-- 这是一个测试查询文件
SELECT
    database,
    table,
    formatReadableQuantity(rows) AS rows,
    formatReadableQuantity(bytes) AS bytes
FROM system.tables
WHERE database = 'system'
ORDER BY rows DESC
LIMIT 10;
EOF

# 执行文件中的查询
clickhouse-client --queries-file=/tmp/query.sql

2.3 格式化输出

clickhouse-client支持多种输出格式,通过–format参数指定。

常用输出格式

# TabSeparated格式(默认)
clickhouse-client -q "SELECT 1 AS a, 2 AS b" --format TabSeparated
# 输出: 1	2

# TabSeparatedRaw(无引号转义)
clickhouse-client -q "SELECT 'hello' AS a" --format TabSeparatedRaw

# CSV格式
clickhouse-client -q "SELECT 1, 'hello'" --format CSV
# 输出: 1,"hello"

# JSON格式
clickhouse-client -q "SELECT 1 AS a, 2 AS b" --format JSON
# 输出:
# {
   
   
#     "meta":
#     [
#         {"name":"a","type":"UInt8"},
#         {"name":"b","type":"UInt8"}
#     ],
#     "data":
#     [
#         {"a":1,"b":2}
#     ],
#     "rows":1,
#     "statistics":{"elapsed":0.0001,"rows_read":1,"bytes_read":1}
# }

# JSONCompact
clickhouse-client -q "SELECT 1 AS a, 2 AS b" --format JSONCompact
# 输出: [[1,2]]

# JSONEachRow(流式JSON)
clickhouse-client -q "SELECT 1 AS id, 'test' AS name" --format JSONEachRow
# 输出: {"id":1,"name":"test"}

# Pretty格式(美化输出)
clickhouse-client -q "SELECT * FROM system.numbers LIMIT 3" --format PrettyCompact
# ┌─number─┐
# │      0 │
# │      1 │
# │      2 │
# └───┘

# PrettyJSON
clickhouse-client -q "SELECT arrayMap(x -> x*2, range(3))" --format PrettyJSONCompact

格式对比表

格式名称 说明 适用场景
TabSeparated TSV格式,制表符分隔 ETL、Shell脚本
CSV CSV格式,逗号分隔 数据导出、Excel导入
JSON 标准JSON API接口、Web应用
JSONCompact 紧凑JSON数组 高效传输
JSONEachRow 每行一个JSON对象 流式处理、日志
Pretty ASCII艺术表格 终端查看
PrettyCompact 紧凑ASCII表格 终端查看
XML 标准XML 特定系统集成
Parquet 列式存储格式 大数据生态
ORC ORC格式 Hadoop生态

2.4 客户端配置文件

可以通过配置文件为clickhouse-client设置默认参数。

配置文件位置

  • ~/.clickhouse-client/config.xml(用户级)
  • /etc/clickhouse-client/config.xml(系统级)

配置文件示例

<?xml version="1.0"?>
<clickhouse-client>
    <!-- 默认连接参数 -->
    <host>127.0.0.1</host>
    <port>9000</port>
    <user>default</user>
    <password></password>
    <database>default</database>

    <!-- 客户端设置 -->
    <secure>false</secure>
    <compression>false</compression>

    <!-- 连接超时(秒) -->
    <connect_timeout>10</connect_timeout>

    <!-- 查询超时(秒) -->
    <query_timeout>300</query_timeout>

    <!-- 交互式提示符 -->
    <prompt>clickhouse:{database}></prompt>

    <!-- 日志配置 -->
    <log_level>information</log_level>

    <!-- 输出格式 -->
    <default_format>TabSeparated</default_format>
</clickhouse-client>

高级提示符配置

<!-- 在config.xml中 -->
<prompt_by_database>
    <database default="default">
        <text>my_database({DATABASE})> </text>
    </database>
    <database test>
        <text>TEST({DATABASE})> </text>
        <highlight_syntax>1</highlight_syntax>
    </database>
</prompt_by_database>

3 JDBC驱动连接

3.1 JDBC驱动获取

ClickHouse提供官方JDBC驱动,可以通过Maven或手动下载方式获取。

Maven依赖配置

<dependencies>
    <dependency>
        <groupId>com.clickhouse</groupId>
        <artifactId>clickhouse-jdbc</artifactId>
        <version>0.4.6</version>
    </dependency>
</dependencies>

Gradle依赖配置

implementation 'com.clickhouse:clickhouse-jdbc:0.4.6'

手动下载

# 下载JDBC驱动
curl -O https://github.com/ClickHouse/clickhouse-jdbc/releases/download/0.4.6/clickhouse-jdbc-0.4.6-all.jar

# 或者使用Maven下载
mvn dependency:get -Dartifact=com.clickhouse:clickhouse-jdbc:0.4.6

JDBC驱动版本对比

版本 ClickHouse版本 Java要求 特性
0.3.x 20.x-21.x Java 8+ 基础功能
0.4.x 22.x+ Java 8+ 异步查询、批量写入优化
0.5.x 22.x+ Java 11+ 新协议支持、性能提升

3.2 JDBC连接与代码示例

JDBC URL格式

jdbc:clickhouse://<host>:<port>/<database>?<params>

基础连接代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class ClickHouseJDBCExample {
   
   
    public static void main(String[] args) {
   
   
        // JDBC URL配置
        String jdbcUrl = "jdbc:clickhouse://127.0.0.1:8123/default";

        // 连接属性
        Properties props = new Properties();
        props.setProperty("user", "default");
        props.setProperty("password", "");
        props.setProperty("connect_timeout", "10000");
        props.setProperty("socket_timeout", "30000");
        props.setProperty("compress", "1");  // 启用压缩
        props.setProperty("ssl", "false");   // SSL连接

        try {
   
   
            // 加载驱动(新版DriverManager自动加载)
            Class.forName("com.clickhouse.jdbc.ClickHouseDriver");

            // 建立连接
            Connection conn = DriverManager.getConnection(jdbcUrl, props);

            // 创建语句
            Statement stmt = conn.createStatement();

            // 执行查询
            ResultSet rs = stmt.executeQuery("SELECT 1 AS a, 'Hello' AS b");
            while (rs.next()) {
   
   
                System.out.println("a: " + rs.getInt("a"));
                System.out.println("b: " + rs.getString("b"));
            }

            // 关闭连接
            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
    }
}

PreparedStatement使用

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;

public class ClickHousePreparedStatement {
   
   
    public static void main(String[] args) {
   
   
        String jdbcUrl = "jdbc:clickhouse://127.0.0.1:8123/testdb";
        Properties props = new Properties();
        props.setProperty("user", "default");

        try (Connection conn = DriverManager.getConnection(jdbcUrl, props)) {
   
   

            // 插入数据(使用PreparedStatement)
            String insertSQL = "INSERT INTO user_events (user_id, event_type, event_time, amount) VALUES (?, ?, ?, ?)";
            try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
   
   
                for (int i = 1; i <= 100; i++) {
   
   
                    pstmt.setInt(1, i);
                    pstmt.setString(2, "click");
                    pstmt.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
                    pstmt.setDouble(4, Math.random() * 100);
                    pstmt.addBatch();
                }
                pstmt.executeBatch();
            }

            // 查询数据(使用PreparedStatement防注入)
            String selectSQL = "SELECT * FROM user_events WHERE user_id = ? AND amount > ?";
            try (PreparedStatement pstmt = conn.prepareStatement(selectSQL)) {
   
   
                pstmt.setInt(1, 1);
                pstmt.setDouble(2, 50.0);

                try (ResultSet rs = pstmt.executeQuery()) {
   
   
                    while (rs.next()) {
   
   
                        System.out.printf("User: %d, Event: %s, Amount: %.2f%n",
                            rs.getInt("user_id"),
                            rs.getString("event_type"),
                            rs.getDouble("amount"));
                    }
                }
            }

        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
    }
}

连接池配置(HikariCP示例)

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class ClickHouseConnectionPool {
   
   
    public static HikariDataSource createDataSource() {
   
   
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:clickhouse://127.0.0.1:8123/default");
        config.setUsername("default");
        config.setPassword("");

        // 连接池大小
        config.setMaximumPoolSize(20);
        config.setMinimumIdle(5);

        // 超时设置
        config.setConnectionTimeout(30000);
        config.setIdleTimeout(600000);
        config.setMaxLifetime(1800000);

        // 连接测试
        config.setConnectionTestQuery("SELECT 1");

        return new HikariDataSource(config);
    }
}

4 Python连接

4.1 clickhouse-driver安装与使用

clickhouse-driver是Python中使用最广泛的ClickHouse客户端库。

安装

pip install clickhouse-driver

基础使用

from clickhouse_driver import Client

# 创建客户端连接
client = Client(
    host='127.0.0.1',
    port=9000,
    database='default',
    user='default',
    password='',
    connect_timeout=10,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值