
数据库时序数据库实时分析【免费下载链接】questdbQuestDB is a high performance, open-source, time-series database项目地址https://gitcode.com/gh_mirrors/qu/questdb点击查看免费下载QuestDB 仓库在 Rust 侧基于parquet2生态提供了一款轻量级命令行工具parquet-tools用于从 Parquet 文件中快速提取元数据、行数以及按页转储列数据。本文以该工具的官方说明为核心结合 cli.yaml、main.rs 及其三个子命令实现meta、rows、dump的源码完整讲解每个子命令的参数、输出字段含义与底层实现原理帮助你用一条命令完成 Parquet 文件的体检与排障。工具定位与仓库位置parquet-tools 位于仓库的 core/rust/parquet2/parquet-tools 目录与parquet2cratecore/rust/parquet2同层。从 Cargo.toml 可以看到它的依赖关系parquet2 { version 0.17, path ../ }直接以路径方式引用同仓库的 parquet2 实现因此工具所见即所读能反映 QuestDB 实际使用的 Parquet 解析逻辑clap { version 2.33, features [yaml] }命令行解析基于 clap 2.x 的 YAML 配置驱动模式全部参数定义集中在src/cli.yaml。在 QuestDB 整体架构中Parquet 读取能力同样贯穿 Java 侧如 ParquetScanFunctionFactory.java、ReadParquetFunctionFactory.java 等 SQL 函数而 parquet-tools 则提供了一条不依赖数据库引擎、直接面向 Parquet 文件本身的命令行检查路径非常适合在排查parquet相关 SQL 查询或数据导入问题之前先对文件做一次快速体检。构建与运行parquet-tools 是一个标准 Rust binary crate在parquet-tools目录下即可构建运行cd core/rust/parquet2/parquet-tools cargo build --release ./target/release/parquet_tools file [SUBCOMMAND]仓库还自带了用于测试的样例文件data/sample.parquet100 行运动员数据见 rows.rs 测试用例可直接用于验证工具行为。需要说明的是parquet-tools 定位为只读检查工具运行它不会修改 Parquet 文件本身。命令行语法总览根据官方 README 与 cli.yaml工具的完整用法如下USAGE: parquet-tools file [SUBCOMMAND] FLAGS: -h, --help Prints help information -V, --version Prints version information ARGS: file Parquet file to read SUBCOMMANDS: dump dumps data from column help Prints this message or the help of the given subcommand(s) meta meta information about the file rowcount number of rows from file关键点file是必填位置参数cli.yaml中required: true, index: 1用于指定要读取的 Parquet 文件路径若未提供任何子命令工具仅解析文件参数后正常退出main.rs中三个子命令分支都未命中每个子命令都有各自的附加选项见下文各小节。rowcount秒级统计文件总行数rowcount子命令实现最为直接位于 rows.rslet metadata read_metadata(mut file)?; write!(writer, Total RowCount: {}, metadata.num_rows)?;它通过parquet2::read::read_metadata读取文件尾部 footer 中的元数据直接输出num_rows字段不涉及任何数据页解码因此速度极快。输出格式为Total RowCount: 100该子命令没有附加参数适用于快速确认文件行数是否与预期一致例如排查写入侧行数统计错误。meta元数据与 schema 全景视图meta是最强大的子命令实现位于 meta.rs用于展示文件级、schema 级和列块级的三层信息。参数说明参数全称说明-e--extra显示文件中的额外键值对元数据key-value metadata-s--stats追加显示各列的统计信息min/max/null count输出字段解读meta输出共分四个区块以--------------------------------------------------源码中的SEPARATOR常量分隔1. 文件级信息file: data/sample.parquet creator: parquet-cpp version 1.5.1-SNAPSHOT version: 1 groups: 1对应源码中读取的metadata.created_by、metadata.version与metadata.row_groups.len()。creator为写入方标识示例文件由 parquet-cpp 写入version为 Parquet 格式版本groups为 Row Group 数量。2. 文件 schema使用-e时先打印额外元数据--extra会先打印文件携带的任意 key-value 元数据如写入方自定义属性随后是 schema 树。每个字段按字段名 Repetition ID P:物理类型 L:逻辑类型 C:转换类型的顺序呈现对应源码parquet_type_str中的field_info.name、field_info.repetition、field_info.id、physical_type、logical_type、converted_typefile schema: schema -------------------------------------------------- ID Optional None P:Int64 L:None C:None Name Optional None P:ByteArray L:Some(STRING(StringType)) C:Some(Utf8) Age Optional None P:Double L:None C:None其中P是物理存储类型Int64/ByteArray/Double 等L是逻辑类型如 STRINGC是转换类型如 Utf8用于区分底层怎么存与语义上是什么。3. Row Group 与列块信息group: 1 R:100 B:9597 -------------------------------------------------- 0: ID Int64 Snappy DO:531 RC:100 SZ:694/981/1.41 ENC:[PlainDictionary, Plain, Rle]每一列的完整字段含义字段含义源码来源序号列在 schema 中的索引列块枚举索引列路径schema 中的点分路径如path_in_schema.join(.)c.descriptor().path_in_schema物理类型Int64、ByteArray、Double等c.physical_type()压缩Snappy等压缩算法c.compression()DO数据页偏移量Data Page Offset可用于定位页在文件中的位置c.data_page_offset()RC该列块的值数量c.num_values()SZ压缩大小/未压缩大小/压缩比c.compressed_size()、c.uncompressed_size()及其比值ENC列编码如[PlainDictionary, Plain, Rle]c.column_encoding()ST仅--statsmin/max/null 统计c.statistics()group:行的R为该组行数、B为该组总字节数。使用--stats查看列统计追加-s后每列末尾会追加统计信息可用于快速判断列的数据分布与空值情况1: Name ByteArray Snappy DO:2938 RC:100 SZ:2329/2544/1.09 ENC:[PlainDictionary, Plain, Rle]ST:[max: ric Claude Jacques Poujade min: Abigail Jean Abby Larson null: 0] 3: Age Double Snappy DO:3488 RC:100 SZ:264/339/1.28 ENC:[PlainDictionary, Plain, Rle]ST:[max: ... min: ... null: 3]从源码看统计信息中的 min/max 以 PLAIN 编码的Vecu8形式呈现statistics_str直接format!({:?}, stats.as_ref())因此数值类型如 Double、Int64会以原始字节形式显示字符串列则直接显示可读文本null:表示该列的空值数量。dump按页转储列数据dump子命令用于深入数据页层面实现位于 dump.rs。参数说明参数全称说明-c--columns指定要转储的列索引列表可多次指定multiple: true不传则默认转储所有列-s--size从 cli.yaml 看为每页打印的采样条数默认 5该参数已定义但当前版本 main.rs 尚未消费从源码结构看-s/--size参数已在 cli.yaml 中预留sample size to be printed from page (default 5)但 main.rs 目前只解析了columns参数尚未将size传入dump_file使用时应以实际行为为准。输出结构dump按 Row Group → 列 → 页三层组织输出。以全列默认转储为例每个 Row Group 先打印总览Group: 0 Rows: 100 Bytes: 9597 --------------------------------------------------随后对每个指定列调用parquet2::read::get_page_iterator遍历数据页区分数据页与字典页打印Page: 0 Column: 0 Type: PageV1 Bytes: 981 Page: 0 Column: 1 Type: DictPageType: PageV1/PageV2对应DataPageHeader::V1/V2区分两种数据页头版本Type: DictPage字典页Dictionary Page配合ENC:[PlainDictionary, ...]可确认该列使用了字典编码Bytes数据页的未压缩大小。dump的价值在于页级别观察可以直观看到每列的页数量、页版本、字典页分布与页大小是分析 Parquet 文件压缩效率与编码选择的实用手段。实现原理从命令行到 parquet2 的调用链整个工具的分发逻辑集中在 main.rsclap::load_yaml!(cli.yaml)加载 cli.yaml 中定义的参数结构校验file位置参数缺失时打印No parquet file to read并退出依据子命令分派rowcount走show_rowsmeta走show_meta透传extra与stats布尔开关dump走dump_file透传列索引列表。三个子命令共享同一底层入口parquet2::read::read_metadata仅从文件 footer 读取元数据只有dump会进一步通过get_page_iterator触及实际数据页。所有函数都接受W: Write泛型 writerlib.rs 定义了统一的ResultT别名与SEPARATOR常量默认输出到标准输出便于重定向到文件或与其他命令组合。测试验证每个子命令都配有基于样例文件data/sample.parquet的单元测试可作为输出格式的权威参考rows.rs 的test_show_rows断言输出恰为Total RowCount: 100meta.rs 的test_show_meta/test_show_meta_stats逐字符断言完整输出含与不带统计信息两种模式精确到列宽对齐dump.rs 的test_dump_file断言输出包含Group: 0与Rows: 100。若你修改或移植此工具可直接复用这些测试作为回归基线若想了解 parquet2 底层 API 的更多用法如get_page_iterator、read_metadata的完整签名可继续阅读 parquet2 源码。小结parquet-tools 虽小却是理解 Parquet 文件内部结构的理想入门工具rowcount解决有多少行meta解决结构是什么、压缩与编码如何、统计如何dump解决数据页如何分布。在 QuestDB 中处理parquet数据如通过read_parquet等 SQL 功能读取外部 Parquet 文件遇到问题时先用 parquet-tools 对文件做一次元数据体检往往能快速定位 schema 不匹配、压缩异常或行数不符等根因。赞分享数据库时序数据库实时分析【免费下载链接】questdbQuestDB is a high performance, open-source, time-series database项目地址https://gitcode.com/gh_mirrors/qu/questdb点击查看免费下载相关推荐VictoriaMetrics 数据迁移实战vmctl 命令行工具完整指南VictoriaMetrics 数据迁移实战vmctl 命令行工具完整指南 导读 vmctl 是 VictoriaMetrics 官方提供的命令行数据迁移工时序数据库数据库指标监控可观测性后端ParquetViewer终极指南免费Windows工具轻松可视化Parquet文件数据告别命令行烦恼ParquetViewer终极指南免费Windows工具轻松可视化Parquet文件数据告别命令行烦恼 Apache Parquet文件作为大数据分析中的标桌面应用数据分析数据可视化数据库客户端如何使用filetype.py3行代码实现文件类型智能检测的完整指南如何使用filetype.py3行代码实现文件类型智能检测的完整指南 想要在Python中快速准确地识别文件类型吗filetype.py是一个轻量级、无依赖数据库时序数据库实时分析上一篇如何用 React Native Sound 打造高效可复用的音频播放组件下一篇告别同步焦虑用Docker打造Obsidian-Git私有备份服务器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考