Clickhouse系列之Java与Python语言两种客户端连接方式案例

979 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

前言

Clickhouse做为一款优秀的数据库,除了用客户端工具去连接使用之外,在开发过程中,我们也需要自己按需去连接客户端,根据业务需求去做一些数据分析与展示。本节会教大家使用Java和Python语言去连接Clickhouse。

正文

Java应用使用JDBC连接Clickhouse

首先我们看下Java应用和Clickhouse的交互架构。

image.png

a) 让我们从连接到安装Java的机器上的Unix shell开始,并为我们的最小Java应用程序创建一个项目目录

mkdir ~/hello-clickhouse-java-app

b) 现在我们去下载Java的JDBC依赖

cd ~/hello-clickhouse-java-app
mkdir lib
wget -P lib https://repo1.maven.org/maven2/com/clickhouse/clickhouse-jdbc/0.3.2-patch7/clickhouse-jdbc-0.3.2-patch7-shaded.jar

c) 我们可以用idea或者eclipse去创建一个Java应用,当然,我们也可以直接在服务器上去手动创建,如:

cd ~/hello-clickhouse-java-app\
mkdir -p src/main/java/helloclickhouse\
touch src/main/java/helloclickhouse/HelloClickHouse.java

d) 现在我们用vim命令打开HelloClickhouse.java文件,编写代码

import com.clickhouse.jdbc.*;
import java.sql.*;
import java.util.*;

public class HelloClickHouse {
    public static void main(String[] args) throws Exception {

        String url = "jdbc:ch://<host>:<port>";
        Properties properties = new Properties();
        // properties.setProperty("ssl", "true");
        // properties.setProperty("sslmode", "NONE"); 
        ClickHouseDataSource dataSource = new ClickHouseDataSource(url, properties);
        try (Connection connection = dataSource.getConnection(<username>, <password>);
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("select * from system.tables limit 10")) {
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            int columns = resultSetMetaData.getColumnCount();
            while (resultSet.next()) {
                for (int c = 1; c <= columns; c++) {
                    System.out.print(resultSetMetaData.getColumnName(c) + ":" + resultSet.getString(c) + (c < columns ? ", " : "\n"));
                }
            }
        }
    }
}

e) 好啦,现在我们去编译执行

cd ~/hello-clickhouse-java-app\
java -classpath lib/clickhouse-jdbc-0.3.2-patch7-shaded.jar src/main/java/helloclickhouse/HelloClickHouse.java
Python应用使用JDBC连接Clickhouse

Python语言我们需要下载对应的依赖,但是python和clickhouse会存在兼容性,因此,我们需要格外注意这一点,有时候错误不一定是代码问题,而是兼容性问题。

a) 依赖下载

pip install clickhouse-connect

b) 对于兼容性,官方也给到解释了

ClickHouse Connect目前处于测试阶段,只有当前的测试版本受到积极支持。在报告任何问题之前,请更新到最新版本。问题应在GitHub项目中归档。
ClickHouse Connect的未来版本保证在发布时与积极支持的ClickHouse版本兼容(通常是最新的三个稳定版本和两个最新的lts版本

c) 创建一个项目

mkdir python_project
touch HelloClickhouse.py

d) 编写代码,用vim命令打开HelloClickhouse.py

import clickhouse_connect

client = clickhouse_connect.get_client(host='localhost', username='default', password='password')

client.command('CREATE TABLE new_table (key UInt32, value String, metric Float64) ENGINE MergeTree ORDER BY key')

row1 = [1000, 'String Value 1000', 5.233]
row2 = [2000, 'String Value 2000', -107.04]
data = [row1, row2]
client.insert('new_table', data, column_names=['key', 'value', 'metric']) 

result = client.query('SELECT max(key), avg(metric) FROM new_table')
print(result.result_set)

需要注意的点是,要使用HTTP(S)连接ClickHouse,我们需要知道以下点:

  • 主机和端口:通常,使用TLS时端口为8443,不使用TLS则为8123。
  • 数据库名称:开箱即用,有一个名为default的数据库,请使用要连接的数据库的名称。
  • 用户名和密码:开箱即用,默认用户名。使用适合您的用例的用户名。

总结

本节主要讲解使用Java语言和Python语言去连接Clickhouse,在生产过程中,我们用Java去做数据分析或者是对外提供接口是比较多的,Python尽管也不错,更多是做为一个分析脚本去写和使用。因此对于一个大数据开发者而言,使用这两种语言去使用Clickhouse都是必要的技能。如有问题,欢迎留言讨论!!!