ByteHouse 云数仓版支持通过 ClickHouse 原生 NodeJS 客户端连接。本文介绍了如何使用 ClickHouse 连接 ByteHouse 云数仓版并执行建表、查询等操作。
请确保您使用的 ClickHouse NodeJS 客户端版本为 v2.4.2 及以上版本。
使用 npm 安装 ClickHouse NodeJS 客户端。
npm install clickhouse@2.4.2
ByteHouse 支持通过 IAM 用户或数据库用户连接 ClickHouse NodeJS。IAM 用户与数据库用户二者差异说明如下,您可按需选择。
更多 IAM 用户和数据库用户的介绍请参见以下文档:
请参考步骤三:获取 ByteHouse 连接串信息,了解如何通过 IAM 用户方式连接到 ByteHouse。
通用参数说明如下:
参数 | 配置说明 |
|---|---|
host | 配置为 ByteHouse 的公网/私网域名,您可以在 ByteHouse 控制台的租户管理 > 基本信息 > 网络信息中查看并复制域名信息,详情请参见步骤二:配置网络信息。 |
port | 固定为 8123。 |
User & Password | 登录 ByteHouse 数据库的用户名和密码。
|
VIRTUAL_WAREHOUSE_ID | 可选配置,配置为计算组名。如果您需要指定计算组进行查询和写入,可配置该参数。 |
Database | ByteHouse 数据库名称。您可登录 ByteHouse 控制台,在数据库页面查看并复制数据库。 |
参数 | 配置说明 |
|---|---|
host | 配置为 ByteHouse 的公网/私网域名,您可以在 ByteHouse 控制台的租户管理 > 基本信息 > 网络信息中查看并复制域名信息,详情请参见步骤二:配置网络信息。 |
port | 固定为 8123。 |
User & Password | 登录 ByteHouse 数据库的用户名和密码。
|
VIRTUAL_WAREHOUSE_ID | 可选配置,配置为计算组名。如果您需要指定计算组进行查询和写入,可配置该参数。 |
Database | ByteHouse 数据库名称。您可登录 ByteHouse控制台,在数据库页面查看并复制数据库。 |
可参考下面代码连接至 ByteHouse,使用时注意替换连接语句中的 {host} 、{password}、{user}、{Database}、{VIRTUAL_WAREHOUSE_ID} 等连接信息字段,获取方式请参见获取 ByteHouse 连接信息。
const host = '{Host}'; const port = 8123; const password = '{Password}'; const user = '{User}'; const database = '{Database}'; const virtual_warehouse = '{VIRTUAL_WAREHOUSE_ID}'; const clickhouse = new ClickHouse({ url: util.format('https://%s', host), port: port, debug: false, basicAuth: { username: user, password: password, }, isUseGzip: false, usePost: false, format: 'json', config: { session_timeout: 60, output_format_json_quote_64bit_integers: 0, enable_http_compression: 0, database: database, virtual_warehouse: virtual_warehouse, }, });
参数说明如下:
参数 | 配置说明 |
|---|---|
debug | 是否开启 debug 模式,默认值为 false。 |
basicAuth.username | 用户名,固定为 bytehouse。 |
basicAuth.password | 连接密码,设置为 ByteHouse 云数仓版的 API Key。您可登录 ByteHouse 云数仓版控制台,在租户管理页签下,单击连接信息,新建并复制 API Key。 |
isUseGzip | 设置是否启用 Gzip 压缩传输数据。如需启用,可设置为 true。默认值为 false。 |
usePost | 设置是否使用 POST 方法发送查询请求。POST 请求适用于查询内容过大的场景,如需启用此功能,将该值设置为 |
format | 指定查询结果或插入数据的格式,支持 JSON、CSV、TSV 格式。当前不支持 JSONEachRow 格式,请勿设置为该格式。 |
config.session_timeout | 设置会话超时时间,默认值为 60 秒。 |
config.output_format_json_quote_64bit_integers | 控制 JSON 格式输出时 64 位整数是否被引号包裹,默认值为 0。设置为 0 时表示直接以数字形式返回,设置为 1 时表示以字符串形式返回(例如 |
config.enable_http_compression | 设置是否启用 HTTP 传输压缩,设置为 0 表示不启用,设置为 1 表示启用。 |
config.database | 设置为您需要连接的 ByteHouse 云数仓版数据库名称。 |
config.virtual_warehouse | 可选,指定 ByteHouse 云数仓版计算组。您可登录 ByteHouse CDW 控制台,在计算组页签下,查看并复制计算组 ID。 |
连接成功后,您可使用以下代码创建数据库、表、插入数据并查询数据。
import { ClickHouse } from 'clickhouse'; import * as util from "node:util"; const host = '{Host}'; const port = 8123; const password = '{Password}'; const user = '{User}'; const database = '{Database}'; const virtual_warehouse = '{VIRTUAL_WAREHOUSE_ID}'; const clickhouse = new ClickHouse({ url: util.format('https://%s', host), port: port, debug: false, basicAuth: { username: user, password: password, }, isUseGzip: false, usePost: false, format: 'json', config: { session_timeout: 60, output_format_json_quote_64bit_integers: 0, enable_http_compression: 0, database: database, virtual_warehouse: virtual_warehouse, }, }); // @ts-ignore // 完整案例 async function run() { try { await clickhouse.query('DROP DATABASE IF EXISTS bhnodetest').toPromise(); await clickhouse.query('CREATE DATABASE IF NOT EXISTS bhnodetest').toPromise(); await clickhouse.query(` CREATE TABLE bhnodetest.sample_table ( id Int32, name String ) ENGINE = CnchMergeTree() ORDER BY id `).toPromise(); await clickhouse.insert( 'INSERT INTO bhnodetest.sample_table (id, name)', [ [1, 'Alice'], [2, 'Bob'], ] ).toPromise(); const rows = await clickhouse.query('SELECT * FROM bhnodetest.sample_table FORMAT JSON').toPromise(); console.log('Query result:', rows); } catch (err) { console.error('Error running ClickHouse operations:', err); } } // @ts-ignore await run();
该示例演示了通过回调函数处理查询结果的异步执行方式。
clickhouse.query('SELECT * FROM bhnodetest.sample_table FORMAT JSON').exec((err, rows) => { if (err) { console.error('Callback query error:', err); } else { console.log('Query result (Callback):', rows); } });
该示例演示了通过流(Stream)方式处理查询结果,适用于返回数据量较大的场景,如批量读取数据,可逐行处理数据而非等待全部加载完成。
clickhouse.query('SELECT number FROM system.numbers LIMIT 5 FORMAT JSON').stream() .on('data', function (chunk) { const stream = this; process.stdout.write('Stream chunk: ' + chunk.toString()); stream.pause(); setTimeout(() => stream.resume(), 1000); // 模拟背压场景 }) .on('error', err => { console.error('Stream error:', err); }) .on('end', () => { console.log('\nStream ended.'); });
该示例演示了通过流(Stream)方式处理查询结果,适用于返回数据量较大的场景,如批量读取数据,可逐行处理数据而非等待全部加载完成。
clickhouse.query('SELECT number FROM system.numbers LIMIT 5 FORMAT JSON').stream() .on('data', function (chunk) { const stream = this; process.stdout.write('Stream chunk: ' + chunk.toString()); stream.pause(); setTimeout(() => stream.resume(), 1000); // 模拟背压场景 }) .on('error', err => { console.error('Stream error:', err); }) .on('end', () => { console.log('\nStream ended.'); });