ClickHouse 测试数据集一键构建:create-test-datasets 技能与 hits/visits/TPC-DS/TPC-H 数据集详解 📅 发布时间:2026/9/7 20:01:37 👁 浏览次数: ClickHouse 测试数据集一键构建create-test-datasets 技能与 hits/visits/TPC-DS/TPC-H 数据集详解【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文围绕 ClickHouse 仓库中的 Claude 技能定义 create-test-datasets/SKILL.md 展开完整解析该技能支持的hits、visits、tpcds、tpch四类标准测试数据集的创建流程从参数解析、服务可用性校验、冲突表检查到各数据集的具体建表脚本与底层 S3 Web Disk 加载机制。读完本文你可以直接复用仓库内脚本在本地 ClickHouse 实例上快速搭建与官方测试环境完全一致的数据集并理解其表结构、分区采样设计与“远程数据本地不落地”的实现原理。一、技能定位与调用约定create-test-datasets是 ClickHouse 仓库.claude/skills/目录下定义的一个自动化技能与 bisect、perf-comparison 等开发辅助技能并列其职责是“通过执行标准创建脚本来构建测试数据集并首先确保服务端处于运行状态”原文 descriptionCreate test datasets (hits, visits, tpcds, tpch) from standard scripts. Ensures the server is running first.。技能 frontmatter 中的关键元数据如下argument-hint: [hits] [visits] [tpcds] [tpch]—— 提示用户可传入这四个数据集名称的任意组合allowed-tools—— 仅允许clickhouse-client、clickhouse、pgrep、ls、cat、bash等受限命令体现了“只连接数据库、不越权操作”的最小权限原则$ARGS可选—— 空格分隔的数据集名称列表取值必须来自{hits, visits, tpcds, tpch}未提供参数时默认创建hits visits。典型调用方式/create-test-datasets # 创建默认的 hits visits /create-test-datasets hits # 只创建 hits /create-test-datasets tpch tpcds # 创建 TPC-H 和 TPC-DS /create-test-datasets hits visits tpch若传入的任一参数不在合法集合内技能要求报告错误并立即停止不做任何猜测式回退。二、前置检查确认服务端在运行技能的第一步硬性前置是验证clickhouse-server可达clickhouse-client -q SELECT 1 21这里有一个明确的行为约束如果服务不可达技能只报错、不尝试自行启动服务而是要求用户先手动拉起服务。这一约定避免了技能在未知状态下启动守护进程所带来的端口、权限与数据目录副作用也让故障定位的责任边界清晰。三、冲突检查绝不覆盖已有表在做任何变更前技能要求先查询system.tables一次性确认目标对象是否已存在clickhouse-client -q SELECT database || . || name FROM system.tables WHERE (database test AND name IN (hits, visits)) OR (database tpcds) OR (database tpch)冲突判定规则按请求对象分别适用请求的数据集冲突条件hitstest.hits已存在visitstest.visits已存在tpcdstpcds数据库中存在任意表tpchtpch数据库中存在任意表发现任何冲突时技能要求完整报告所有冲突项并停止不做DROP或覆盖建议用户手动清理后重跑。注意tpcds/tpch的粒度是“整个库必须为空”而hits/visits的粒度是“单表不存在”这与后文各脚本的幂等设计建库用IF NOT EXISTS但建表/灌数据不做删除直接对应。四、hits 与 visits从官方建表语句精确提取并重命名hits与visits的数据模型定义在 tests/docker_scripts/create.sql 中该文件包含两条完整的CREATE TABLE语句datasets.hits_v1第 1 行至第 144 行与datasets.visits_v1第 146 行至第 337 行。技能的处理方式是只提取被请求的那条语句把表名替换为test.hits/test.visits后直接执行从而避免产生不必要的中间表datasets.hits_v1本身不会被创建。先确保目标库存在clickhouse-client -q CREATE DATABASE IF NOT EXISTS test仅创建hits时clickhouse-client --multiquery $(sed -n /^CREATE TABLE datasets\.hits_v1/,/);/p tests/docker_scripts/create.sql | sed s/datasets\.hits_v1/test.hits/)仅创建visits时clickhouse-client --multiquery $(sed -n /^CREATE TABLE datasets\.visits_v1/,/);/p tests/docker_scripts/create.sql | sed s/datasets\.visits_v1/test.visits/)两个sed的分工值得注意第一个按“从CREATE TABLE datasets.hits_v1行开始、到第一个);行结束”的地址范围抽取语句hits_v1的);位于 create.sql 第 144 行正好在visits_v1之前因此不会误吞第二条语句第二个做表名替换。--multiquery是因为建表语句后紧跟 SETTINGS 块需按多语句方式提交。4.1 hits 表结构要点hits是经典的 Web 访问日志数据集共 130 余个字段覆盖页面标题、客户端 IP、UserAgent、解析出的 URL/Referer 分类数组、屏幕分辨率、浏览器行为时序ResponseStartTiming、DOMContentLoadedTiming等、UTM 参数与 Openstat 广告归因字段。其引擎与关键子句为ENGINE MergeTree PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID)按EventDate的年月分区时间序列查询可做分区裁剪排序键以CounterID计数器打头符合“按站点查日志”的主流访问模式SAMPLE BY intHash32(UserID)支持基于排序键前缀的采样查询是 ClickHouse 官方文档中采样功能的经典示例表。4.2 visits 表结构要点visits是会话visit粒度数据字段包括会话起止 URL、点击日志ClickURL、ClickMarketPP等、目标事件数组Goals.ID、Goals.EventTime、市场转化数组Market.Type等。其引擎是ENGINE CollapsingMergeTree(Sign) PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID) SAMPLE BY intHash32(UserID)CollapsingMergeTree(Sign)表示同一排序键组合下可能出现Sign为 1/-1 的行对后台合并时会折叠抵消这是会话数据支持“插入更新/撤销”语义的标准做法。两表字段中大量带点号的列名如ParsedParams.Key1、TraficSource.Domain需用引号包裹这也是官方数据集 schema 的既有约定。4.3 数据从哪来Web Disk 本地缓存hits_v1/visits_v1建表语句末尾的 SETTINGS 是理解整个流程的关键SETTINGS table_disk 1, disk disk(type cache, path filesystem_caches/stateful/, max_size 4G, disk disk(type web, endpoint https://clickhouse-datasets-web.s3.us-east-1.amazonaws.com/store/78e/78ebf6a1-d987-4579-b3ec-00c1a087b1f3/));这表明数据本体并不在本地表挂载在一个web类型的远端磁盘指向官方 S3 数据集存储其外层再套一层本地cache磁盘路径filesystem_caches/stateful/上限 4G。从源码结构看这意味着创建表几乎是秒级的——本地只写元数据不复制数百 GB 的明细数据首次查询会按需从远端拉取并写入本地缓存重复查询命中缓存后性能大幅提升该机制要求服务端版本支持 Web Disk 的按需数据读取这是 ClickHouse 较新的能力旧版本无法使用此配置且需要网络可达clickhouse-datasets-web.s3.us-east-1.amazonaws.com。因此运行技能前除了“服务在跑”隐含前提是网络能访问该 S3 端点。五、TPC-DS脚本转换 init.sql 并挂到 S3 Web Disk当请求包含tpcds时执行 tests/docker_scripts/create_tpcds.shbash tests/docker_scripts/create_tpcds.sh脚本头部即说明了其原理“Creates TPC-DS SF1 tables in tpcds database by transforming tests/benchmarks/tpc-ds/init.sql to use S3 web disk.”。其内部逻辑REPO_ROOT$(cd $(dirname $0)/../.. pwd) INIT_SQL$REPO_ROOT/tests/benchmarks/tpc-ds/init.sql S3_BASEhttps://tpc-ds-sf1.s3.amazonaws.com clickhouse-client --query CREATE DATABASE IF NOT EXISTS tpcds随后用一段awk程序流式改写 tests/benchmarks/tpc-ds/init.sql跳过---注释行与空行遇到CREATE TABLE xxx时提取表名并把语句改写为CREATE TABLE tpcds.name遇到语句结束符);时自动补上引擎与磁盘设置ENGINE MergeTree SETTINGS table_disk 1, disk disk(type web, endpoint https://tpc-ds-sf1.s3.amazonaws.com/table_name/);改写后的 SQL 通过clickhouse-client -m --data_type_default_nullable1提交。-mmultiquery与--data_type_default_nullable1的组合意味着init.sql中未显式标注NOT NULL的列按 Nullable 处理这与 TPC-DS 数据模型中大量可空列的特性相符。init.sql顶部注释给出了官方类型映射约定标识符列映射为Int64*_date_sk、*_time_sk例外用UInt32、整型为Int64、decimal(P,S)为Decimal(P,S)、char(N)为FixedString(N)、varchar(N)为String、日期为Date。该文件共 536 行涵盖call_center、catalog_page、catalog_returns等 TPC-DS 全部 25 张表。配套的 99 条官方查询存放在 tests/benchmarks/tpc-ds/queries/可直接用于基准测试。与 hits/visits 一样TPC-DS 的 SF1Scale Factor 1数据本体位于tpc-ds-sf1.s3.amazonaws.com本地通过 web disk 按需读取脚本本身不产生大规模本地写入。六、TPC-HCREATE TABLE 加 INSERT ... SELECT FROM s3() 两阶段当请求包含tpch时执行 tests/docker_scripts/create_tpch.sh。与 TPC-DS 不同TPC-H 走的是“建本地空表 → 用INSERT ... SELECT FROM s3()显式灌数”的两阶段路线REPO_ROOT$(cd $(dirname $0)/../.. pwd) INIT_SQL$REPO_ROOT/tests/benchmarks/tpc-h/init.sql S3_BASEhttps://clickhouse-datasets.s3.amazonaws.com/h/1 clickhouse-client --query CREATE DATABASE IF NOT EXISTS tpch awk /^--/ { next } /^[[:space:]]*$/ { next } /^CREATE TABLE / { sub(/CREATE TABLE /, CREATE TABLE tpch.) } { print } $INIT_SQL | clickhouse-client -m TABLES(nation region part supplier partsupp customer orders lineitem) for table in ${TABLES[]}; do clickhouse-client --query INSERT INTO tpch.${table} SELECT * FROM s3(${S3_BASE}/${table}.tbl, NOSIGN, CSV) SETTINGS format_csv_delimiter|, input_format_defaults_for_omitted_fields1, input_format_csv_empty_as_default1 done几个细节awk只做表名前缀替换tpch.不追加引擎设置因此 8 张表以默认的 MergeTree 形式落到本地磁盘tests/benchmarks/tpc-h/init.sql 的头部注释明确了 TPC-H 规范的类型映射Identifier →UInt32、Integer →Int32、Decimal →Decimal(12,2)、定长文本 →FixedString(N)并注明该 schema 未在 SF 300 下验证部分 Identifier 列可能需要更宽类型灌数阶段的s3(url, NOSIGN, CSV)直接读取 TPC-H 官方的 pipe 分隔文本文件format_csv_delimiter|对应 TPC-H 标准文件的|分隔符NOSIGN表示匿名无 AK/SK访问input_format_defaults_for_omitted_fields1与input_format_csv_empty_as_default1处理空字段与列缺失的默认值填充七张表nation region part supplier partsupp customer orders lineitem中lineitem是最大的事实表SF1 下约 600 万行该步骤是整个 TPC-H 流程中最耗时的部分且会真实写入本地磁盘。这也是 TPC-H 与 TPC-DS 在本仓库测试体系中的核心差异前者数据本地落盘、可离线使用后者依赖持续的 S3 网络可达。七、结果验证与行数报告全部创建完成后技能要求对每个已建数据集执行确认查询并汇报行数-- hits SELECT test.hits, count() FROM test.hits; -- visits SELECT test.visits, count() FROM test.visits; -- tpcds SELECT name, total_rows FROM system.tables WHERE database tpcds ORDER BY name; -- tpch SELECT name, total_rows FROM system.tables WHERE database tpch ORDER BY name;tpcds/tpch使用system.tables.total_rows而非count()这一选择并非随意对 web disk 上的 TPC-DS 表来说total_rows读取的是元数据统计不需要全表扫描远端对象验证成本极低对 TPC-H 这种本地表而言它同样足够。验证结果每个表的名称与行数需要完整报告给用户作为数据集构建成功的最终证据。八、端到端流程总结把上述七个步骤串起来整个技能的行为链是解析参数合法集合{hits, visits, tpcds, tpch}缺省为{hits, visits}非法即止探活SELECT 1失败即止且不代启服务冲突检查单次查询system.tables命中冲突全部报告并停止绝不DROP建 hits/visitssed精确抽取 create.sql 中对应语句并重命名为test.hits/test.visits数据经 S3 Web Disk 4G 本地缓存按需读取建 tpcdscreate_tpcds.sh 用 awk 改写 tpc-ds/init.sql25 张表全部挂 S3 Web Disk建 tpchcreate_tpch.sh 建本地 8 张表后用s3()函数灌入 SF1 数据验证按数据集类型分别用count()或system.tables.total_rows汇报行数。对需要在本地快速复现官方基准环境tests/benchmarks/下的 TPC-DS 99 查询与 TPC-H 22 查询的开发者而言这套技能与其背后的 tests/docker_scripts/ 脚本构成了仓库内最权威的“数据集准备”参考实现它把“哪些库、哪些表、哪种引擎、数据从哪来”这些易错细节固化成了可复现的自动化流程。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考