简单而强大的接口 点击之家

npm install @apla/clickhouse
概要
const ClickHouse = require('@apla/clickhouse')
const ch = new ClickHouse({ host, port, user, password })
const stream = ch.query("SELECT 1", (err, data) => {})
stream.pipe(process.stdout)
// promise interface, not recommended for selects
// (requires 'util.promisify' for node < 8, Promise shim for node < 4)
await ch.querying("CREATE DATABASE test")
实例:
API 密码
new ClickHouse(options: Options)
Options
| 所需经费 | 默认 | 说明 | |
|---|---|---|---|
host | ✓ | 主机要连接 . | |
user | 认证用户 . | ||
password | 认证密码 . | ||
path (单位:千美元)pathname(中文(简体) ) | / | ClickHouse 服务器的路径名 . | |
port | 8123 | 服务器端口号. | |
protocol | 'http:' | 'https:' 或者说 'http:'。 。 。 . | |
dataObjects | false | 默认( E)false),你会得到每行的数值阵列. 如果你准备好了 dataObjects: true,每行将变成格式为: { fieldName: fieldValue, … }。 。 。 . 免职 format: 'JSON'。 。 。 . | |
format | JSONCompact | 添加 FORMAT 如果没有用于查询的语句. 指定格式 选中 或者说 插入时 数据. 见 “输入和输出数据格式” 查找可能的值. | |
queryOptions | 对象,可以包含任何来自 设置, (中文(简体) ), 限制 财务报告和审定财务报表 权限。 。 。 . 见 实例。 。 。 . | ||
readonly | false | 告诉驱动程序用 HTTP Get 方法发送查询 。 与 readonly=1 设置。 。 。 . 更多细节。 。 。 . | |
timeout, (中文(简体) ), headers, (中文(简体) ), agent, (中文(简体) ), localAddress, (中文(简体) ), servername, (中文(简体) ), 还有.. | 任意 http.request 请求 或者说 网页请求 也可以选择. |
选项示例 :
const ch = new ClickHouse({
host: "clickhouse.msk",
dataObjects: true,
readonly: true,
queryOptions: {
profile: "web",
database: "test",
},
})
clickHouse.query(query, [options], [callback])
向服务器发送查询语句.
query: string
SQL 查询语句.
options: Options
一样 Options,不包括连接选项.
callback: (error, result) => void
总是需要完成.
回返情况: DuplexStream
它支持 .pipe 用于处理记录.
您至少应该有一个错误处理器在听 。 通过查询调用或通过流 error 活动.
| 串流事件 | 说明 |
|---|---|
'error' | 查询执行完成时出错 . 如果您有这两个查询 callback 和流 error 听着,你会得到错误通知 两个听众. |
'metadata' | 当一列信息被解析时 . |
'data' | 当一行可出. |
'end' | 当处理整个响应时. 无论是否有 你应该总是听 |
stream.supplemental
处理响应后,可以从中读取补充响应数据,如行数.
实例:
clickHouse.ping(callback)
发送空查询. 不需要授权.
callback: (error, result) => void
将呼吁完成.
承诺接口
承诺接口 不建议 页:1 INSERT 财务报告和审定财务报表 SELECT 查询.
INSERT无法使用承诺接口进行批量加载数据.SELECT将收集内存中的全部查询结果。 见 内存大小 节.
带有承诺界面查询结果的解析同步. 这意味着大查询导致承诺界面:
- 将同步屏蔽JS线/事件循环.
- 可能导致您的应用程序内存泄漏 最高GC负载.
仅用于已知和极小数据大小的查询.
使用它的良好案例是 DESCRIBE TABLE 或者说 EXISTS TABLE
clickHouse.querying(query, [options])
类似 ch.query(query) 但在内存中收集整个响应并用完整的查询结果解析.
见 内存大小 节.
options: Options
一样 Options,不包括连接选项.
回返情况: Promise
将用整个查询结果解决 .
实例 承诺接口。 。 。 .
clickHouse.pinging()
承诺接口 .ping。 。 。 .
回返情况: Promise
如何运作
装入大量数据 INSERT 声明
INSERT 可用于散装数据加载。 有两种易于执行的格式
带有javascript:CSV和TabSeparated/TSV.
CSV 用于从文件装入, 因此您可以读取 .pipe 输入点击器
文件内容.
要激活 CSV 解析, 您应该设置 format 驱动程序选项或查询 FORMAT 声明到 CSV数字 :
var csvStream = fs.createReadStream('data.csv')
var clickhouseStream = ch.query(statement, { format: CSV })
csvStream.pipe(clickhouseStream)
TSV对于从文件上加载和从外部来源如其他数据库上批量加载是有用的.
仅 \\, (中文(简体) ), \t 财务报告和审定财务报表 \n 需要用绳子来逃出; 数字, 虚数,
布尔斯和日期对象需要一些小的处理. 您可以发送已准备好的 TSV 数据字符串
(行尾会自动被附加),缓冲(总是像现在这样通过)或有字段的矩阵.
内部,每个字段都会被转换为ClickHouse可以接受的格式. 之后逃出并加入了特定格式的分隔符. 如果您需要存储行( 在数组中)并发送预格式数据, 您可以这样做 .
点击之家也支持 约瑟纳克罗 格式 用于插入 javascript 对象,如果您有这样的记录.
const stream = ch.query(statement, { format: 'JSONEachRow' })
stream.write(object) // Do write as many times as possible
stream.end() // And don't forget to finish insert query
内存大小
您可以在这样的单调中将所有记录读入内存:
var ch = new ClickHouse({ host: host, port: port })
ch.querying("SELECT number FROM system.numbers LIMIT 10", (err, result) => {
// result will contain all the data you need
})
在这种情况下 服务器的JSON反应会被读入记忆中, 然后解析成记忆 占用你的CPU。 默认解析器将解析服务器响应 线条并释放出事件。 速度较慢,但内存和CPU效率要高得多 用于更大的数据集.
实例
使用流选择 :
const readableStream = ch.query(
'SELECT * FROM system.contributors FORMAT JSONEachRow',
(err, result) => {},
)
const writableStream = fs.createWriteStream('./contributors.json')
readableStream.pipe(writableStream)
以流插入 :
const readableStream = fs.createReadStream('./x.csv')
const writableStream = ch.query('INSERT INTO table FORMAT CSV', (err, result) => {})
readableStream.pipe(writableStream)
插入单行数据 :
const ch = new ClickHouse(options)
const writableStream = ch.query(`INSERT INTO table FORMAT TSV`, (err) => {
if (err) {
console.error(err)
}
console.log('Insert complete!')
})
// data will be formatted for you
writableStream.write([1, 2.22, "erbgwerg", new Date()])
// prepare data yourself
writableStream.write("1\t2.22\terbgwerg\t2017-07-17 17:17:17")
writableStream.end()
选择大数据集 :
const ch = new ClickHouse(options)
// it is better to use stream interface to fetch select results
const stream = ch.query("SELECT * FROM system.numbers LIMIT 10000000")
stream.on('metadata', (columns) => { /* do something with column list */ })
let rows = []
stream.on('data', (row) => rows.push(row))
stream.on('error', (err) => { /* handler error */ })
stream.on('end', () => {
console.log(
rows.length,
stream.supplemental.rows,
stream.supplemental.rows_before_limit_at_least, // how many rows in result are set without windowing
)
})
插入大数据集 :
const ch = new ClickHouse(options)
// insert from file
const tsvStream = fs.createReadStream('data.tsv')
const clickhouseStream = ch.query('INSERT INTO table FORMAT TSV')
tsvStream.pipe(clickhouseStream)
连接设置 :
const ch = new ClickHouse({
host: 'clickhouse.msk',
queryOptions: {
database: "test",
profile: "web",
readonly: 2,
force_index_by_date: 1,
max_rows_to_read: 10 * 1e6,
},
})
查询设置 :
const ch = new ClickHouse({ host: 'clickhouse.msk' })
const stream = ch.query('INSERT INTO table FORMAT TSV', {
queryOptions: {
database: "test",
insert_quorum: 2,
},
})
承诺接口 :
const ch = new ClickHouse(options)
// Check connection to server. Doesn't requires authorization.
await ch.pinging()
const { data } = await ch.querying("SELECT 1")
// [ [ 1 ] ]
const { data } = await ch.querying("DESCRIBE TABLE system.numbers", { dataObjects: true })
// [ { name: 'number', type: 'UInt64', default_type: '', default_expression: '' } ]