clickhouse-js-node-rowbinary

clickhouse-js-node-rowbinary

热门

生成用于读取/解码和写入/编码 ClickHouse RowBinary 流的 TypeScript/JavaScript 代码,适用于 ClickHouse HTTP 服务器。当用户需要解析或生成 `RowBinary`、`RowBinaryWithNames` 或 `RowBinaryWithNamesAndTypes` 时使用此技能。仅限 Node.js,不涵盖浏览器。

496Star
32Fork
更新于 2026/7/15
SKILL.md
readonly只读
name
clickhouse-js-node-rowbinary
description

生成用于读取/解码和写入/编码 ClickHouse RowBinary 流的 TypeScript/JavaScript 代码, 适用于 ClickHouse HTTP 服务器。当用户需要解析或生成 `RowBinary`、 `RowBinaryWithNames` 或 `RowBinaryWithNamesAndTypes` 时使用此技能。 仅限 Node.js,不涵盖浏览器。

ClickHouse JS RowBinary 编解码器生成器(Node.js)

此技能生成两种方向的线格式:读取器(将字节解码为值)和写入器(将值编码为字节,镜像操作)。通常一个任务只需要其中一侧。本文档是共享入口点——格式门控以及两个方向共用的原则;每个方向的决策、指导以及按类型参考表位于两个同级文件中。

选择你的方向——只阅读你需要的那部分:

  • 将 ClickHouse 的 RowBinary* 响应解码为 JS 值reader.md。流式与全缓冲、行对象与列式、固定模式与运行时模式,以及按类型读取器参考。
  • 将 JS 值编码为 RowBinary 负载发送给 ClickHousewriter.mdSink/writeX 构建块、writeRows 流式处理,以及按类型写入器参考。

按类型的代码是真实的,按方向分别位于 src/readers/src/writers/ 下。

首先:RowBinary 是正确的格式吗?

RowBinary 用于提高吞吐量,但并不自动是最快的路径——在投入定制解析器之前,请将格式与数据形状匹配。

当结果主要是字符串/类似 JSON 的值,并且你整体消费它们时,优先选择 JSON* 格式(例如 JSONEachRow——随机访问几乎所有字段,运行字符串/正则表达式方法,将值视为文本。V8 的原生 JSON.parse 是高度优化的 C++,构建 JS 字符串和对象的速度比 JS 级别的 RowBinary 解码器更快;配合 HTTP 响应压缩(gzip/zstd,可以压缩 JSON 的重复键),网络成本也会降低。

当结果主要由以下类型主导时,RowBinary 明显胜出:

  • 宽数值类型——Int128/Int256/UInt128/UInt256Decimal128/Decimal256
  • 二进制/固定宽度 blob——IPv4IPv6UUIDFixedString
  • 高容量固定宽度数值列,每个值只需一次 DataView 读取。

当主要目标是列式加载和客户端分析时,优先选择 Native 格式(折叠/扫描/过滤列,将类型化数组提供给 Worker 或 WASM)。Native 是列主序的,因此可以直接加载到每列一个类型化数组中,无需转置。

如需帮助选择和使用 JSON* 格式(或 CSV/TSV),请使用 clickhouse-js-node-coding 技能。

核心指导(两个方向)

无论你生成的是读取器还是写入器,这些原则都适用;方向特定的操作指导在 reader.md / writer.md 中。

  • 仅限小端序。 RowBinary 是小端序;针对 x86/ARM。使用 DataView 访问器读取和写入每个多字节数字时,必须传递字面量 true 作为 littleEndian 标志。

  • 先正确,再优化。 首先使用简单的按类型 API 生成正确的编解码器。只有在正确(并经过测试)之后,才进行专门化。在正确性之前不要引入性能假设。

  • 单态化泛型/复合类型。 为每种类型组合生成专门的、内联的代码,而不是在类型已知的情况下传递函数作为参数。

  • 内联叶子操作。 按类型的 readX/writeX 函数是正确的、可组合的参考;生成的编解码器应内联它们的主体,而不是调用它们,这样行循环是直线型的,没有每字段的间接调用(并且固定宽度的合并可以折叠偏移量算术)。

  • 每列注释类型。 内联会抹去类型结构,因此在每列的编码/解码块上方添加简短注释,指明它处理的 ClickHouse 类型。

  • 共享临时缓冲区不可重入。 某些热方法重用模块级临时缓冲区作为写后读对——仅当访问是完全同步时才正确。在填充和读取之间出现 async/yield 边界会破坏值。

  • 默认使用 TypeScript。 除非用户明确要求纯 JavaScript,否则生成 TypeScript 代码和辅助函数。

工作示例

六个端到端示例及其实际加速效果记录在 EXAMPLES.md 中。

不涵盖的范围

  • JSON / CSV / TSV / Parquet 解析 → 使用 clickhouse-js-node-coding
  • 连接错误、挂起、类型不匹配 → 使用 clickhouse-js-node-troubleshooting
  • 浏览器 / Web Worker / Edge → 使用 @clickhouse/client-web

仍有疑问?