‹ 首页

clickhouse-js-node-rowbinary

@clickhouse · 收录于 昨天 · 上游提交 2 天前

Generate TypeScript/JavaScript code that reads/decodes AND writes/encodes ClickHouse RowBinary streams for the ClickHouse HTTP server. Use this skill whenever a user wants to parse or produce `RowBinary`, `RowBinaryWithNames`, or `RowBinaryWithNamesAndTypes`. Node.js only, doesn't cover browsers.

适合你,如果需要用Node.js读写ClickHouse的RowBinary格式。

/ 通过 npx 安装 校验哈希
npx oh-my-skill add clickhouse/agent-skills/clickhouse-js-node-rowbinary
/ 通过 bash 安装
curl -fsSL https://oh-my-skill.com/install.sh | bash -s -- clickhouse/agent-skills/clickhouse-js-node-rowbinary
/ 已经装过?验证本机副本,不用重装
npx oh-my-skill verify clickhouse/agent-skills/clickhouse-js-node-rowbinary
安装目标可用 --agent / --scope 或 --to 明确指定;省略时只会在唯一已存在的 agent 目录上自动选择,零命中或多命中会停止并提示。content_hash 缺失或不一致均拒装。
498GitHub stars
~1.1K最小装载
~5.5K含声明引用
~141.6K文本包总量
索引托管

怎么用

商店整理自技能原文 · 版本 6e5458d · 表述以原文为准
它做什么

当你想解析或生成 ClickHouse 的 RowBinary 数据时,Claude 会生成 TypeScript/JavaScript 代码来读/解码或写/编码二进制流。

什么时候触发

当你提到要解析或生成 RowBinary、RowBinaryWithNames 或 RowBinaryWithNamesAndTypes 格式时触发。仅限 Node.js 环境。

装好后可以这样说
Claude 会生成解码代码。
Claude 会生成编码代码。
Claude 会解释格式选择(不在本技能范围内,但可引导)。
技能原文 SKILL.md作者撰写 · Apache-2.0 · 6e5458d

ClickHouse JS RowBinary Codec Generator for Node.js

This skill generates both directions of the wire format: readers (decode bytes → values) and writers (encode values → bytes, the mirror). A given task normally needs only one side. This file is the shared entry point — the format gate plus the principles common to both directions; the per-direction decisions, guidance, and the per-type reference tables live in two sibling files.

Pick your side — read only the one you need:

  • Decoding a RowBinary* response from ClickHouse into JS values → [reader.md](reader.md). Streaming vs whole-buffer, row-objects vs columnar, fixed vs runtime schema, and the per-type reader reference.
  • Encoding JS values into a RowBinary payload to send to ClickHouse → [writer.md](writer.md). The Sink/writeX building blocks, writeRows streaming, and the per-type writer reference.

The per-type code is real, split by direction under src/readers/ and src/writers/.

First: is RowBinary even the right format?

RowBinary exists for throughput, but it is not automatically the fastest path — match the format to the shape of the data before committing to a bespoke parser.

Prefer a JSON* format (e.g. JSONEachRow) when the result is mostly strings / JSON-like values that you consume wholesale — randomly accessing essentially every field, running string/regexp methods on them, treating values as text. V8's native JSON.parse is heavily optimized C++ and builds JS strings and objects faster than a JS-level RowBinary decoder can; pair it with HTTP response compression (gzip / zstd, which crushes JSON's repetitive keys) and the wire cost shrinks too.

RowBinary clearly wins when the result is dominated by:

  • Wide numericsInt128/Int256/UInt128/UInt256, Decimal128/Decimal256.
  • Binary / fixed-width blobsIPv4, IPv6, UUID, FixedString.
  • High-volume fixed-width numeric columns generally, where each value is a single DataView read.

Prefer the Native format when columnar load and client-side analytics are the main goal (fold/scan/filter columns, feed typed arrays to a Worker or WASM). Native is column-major, so it loads straight into one typed array per column with no transpose.

For help choosing and consuming a JSON* format (or CSV / TSV) instead, use the clickhouse-js-node-coding skill.

Core guidance (both directions)

These principles apply whether you are generating a reader or a writer; the side-specific operational guidance is in [reader.md](reader.md) / [writer.md](writer.md).

  • Little-endian only. RowBinary is little-endian; target x86/ARM. Read and write every multi-byte number with DataView accessors passing a literal true for the littleEndian flag.
  • Correct first, then optimize. First emit a correct codec built from the plain per-type API. Only after it's correct (and tested) specialize it. Don't bake performance assumptions in before correctness.
  • Monomorphize generic/composite types. Emit specialized, inlined code per type combination instead of passing functions as arguments where the type is known ahead of time.
  • Inline the leaf ops. The per-type readX/writeX functions are the correct, composable reference; the generated codec should INLINE their bodies, not call them, so the row loop is straight-line with no per-field indirection (and so the fixed-width coalescing can fold the offset arithmetic together).
  • Annotate the type per column. Inlining erases the type structure, so put a short comment above each column's encode/decode block naming the ClickHouse type it handles.
  • Shared scratch is not reentrant. Some hot methods reuse a module-level scratch buffer as a write-then-read pair — correct only because the access is fully synchronous. An async/yield boundary between populating and reading it corrupts the value.
  • TypeScript by default. Generate TypeScript code and helpers unless the user explicitly asks for plain JavaScript.
Worked examples

Six end-to-end examples with real speedup are catalogued in [EXAMPLES.md](EXAMPLES.md).

Out of scope
  • JSON / CSV / TSV / Parquet parsing → use clickhouse-js-node-coding.
  • Connection errors, hangs, type mismatches → use clickhouse-js-node-troubleshooting.
  • Browser / Web Worker / Edge@clickhouse/client-web.
Still Stuck?
按 Apache-2.0 许可原样转载,未经改动 · 在 GitHub 查看 →

评论

登录即可评论;带「已验证安装」的,是发布者名下有本店的安装或持有记录。