一 clickhouse 客户端的访问接口
clickhouse 的底层访问接口支持TCP和HTTP两种协议,其中,TCP协议拥有更好的性能,其默认端口为9000,主要用于集群见的内部通信及CLI客户端;而http协议则拥有更好的兼容性。通常不建议用户直接使用底层接口访问clickhouse,更为推荐的方式是通过cli 和jdbc这些封装接口,因为他们更为简单易用。
1.1 命令行客户端
clickhouse-client
常用下面2组参数,1是-m在ClickHouse服务所在的机器,进入命令行交互模式
clickhouse-client -m --password '密码'
2是-q执行任务,配合-n允许多个SQL(用;分隔)
clickhouse-client -n -h '主机' --port 9000 -u '用户' --password '密码' -d '库' -q "SHOW TABLES;"
1.1.1 使用案例
导入数据
cat data.csv |
clickhouse-client --host 127.0.0.1 --port 9000 --database test_db --user default \--password='123456' --query="INSERT INTO asd FORMAT CSV" --format_csv_delimiter="|";
导出数据
clickhouse-client --host 127.0.0.1 --port 9000 --database test_db --user default \--password='123456' --query="select * from asd limit 100" --format CSV --format_csv_delimiter="|"
执行sql文件
clickhouse-client --host 127.0.0.1 --port 9000 --database test_db --user default \--password='123456' --multiquery < multi.sql
更多说明
- 可以指定\G来替代分号或者在分号后面。每个字段的值会打印在不同的行中,数据列很多时比较友好。
- –format就是输入输出格式,常用的就是CSV,所有的格式见输入输出格式
- 在交互模式下,如果不指定-m参数,按Enter就执行查询了;如果要执行多行查询语句,需要在换行之前加上反斜杠\。指定了-m就不用加了。
1.2 Java连接ClickHouse
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2</version>
</dependency>
import ru.yandex.clickhouse.ClickHouseConnection;
import ru.yandex.clickhouse.ClickHouseDataSource;
import ru.yandex.clickhouse.settings.ClickHouseProperties;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
// 连接配置
ClickHouseProperties p = new ClickHouseProperties();
p.setUser("用户");
p.setPassword("密码");
p.setDatabase("库");
p.setSocketTimeout(30000);
String url = "jdbc:clickhouse://主机地址:8123";
ClickHouseDataSource ds = new ClickHouseDataSource(url, p);
try {
// 创建连接
ClickHouseConnection conn = ds.getConnection();
try {
Statement statement = conn.createStatement();
// 查询
ResultSet result = statement.executeQuery("SELECT * FROM 表");
while (result.next()) {
ResultSetMetaData metaData = result.getMetaData();
// 获取列,索引从1开始
for (int i = 1; i <= metaData.getColumnCount(); i++) {
String columnName = metaData.getColumnName(i);
Object data = result.getObject(columnName);
System.out.println(columnName + "=>" + data.toString());
}
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}