ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Red Parquet:用 Ruby 读写 Apache Parquet 列式文件的完整指南

Red Parquet:用 Ruby 读写 Apache Parquet 列式文件的完整指南 数据工程大数据序列化数据分析【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow13/arrow点击查看免费下载Red Parquet 是 Apache Arrow 项目中 Apache Parquet 的 Ruby 绑定让 Ruby 开发者能够以一行代码完成 Parquet 文件的读取与写入。本文以 ruby/red-parquet/README.md 为核心结合仓库内的 Ruby 源码、测试用例与底层 C 绑定实现完整讲解 Red Parquet 的架构原理、安装步骤、读写用法、写入属性配置以及行组级高级操作帮助你直接在 Ruby 应用中落地高性能的列式存储读写方案。Red Parquet 是什么一条从 Ruby 到 Parquet C 的绑定链路Red Parquet 是 Apache Parquet 的 Ruby 绑定其底层基于GObject Introspection机制自动生成Apache Parquet是一种列式存储格式按列而非按行组织数据非常适合分析型查询与高压缩比存储。GObject Introspection是 C 库的语言绑定中间件能够在运行时自动为 C 库生成语言绑定无需手写大量胶水代码。技术栈上Red Parquet 借助Apache Parquet GLib位于 c_glib/parquet-glib与gobject-introspection gem完成 Ruby 绑定的自动生成。整条调用链可以概括为Ruby 代码 (Red Parquet) ↓ gobject-introspection gemGObject Introspection 的 Ruby 绑定 ↓ Apache Parquet GLibApache Parquet C 的 C 封装 ↓ Apache Parquet C真正的列式存储实现之所以需要 GLib 这一层桥接是因为 GObject Introspection 无法直接使用 Apache Parquet C 的 C 接口必须先通过 Apache Parquet GLib 把 C 能力包装成可被 GObject Introspection 识别的 C 接口再由 gobject-introspection gem 在 Ruby 侧完成绑定这是理解 Red Parquet 一切功能来源的关键。从仓库源码看require parquet之后lib/parquet.rb 会先加载 red-arrowrequire arrow再通过 lib/parquet/loader.rb 中的Parquet::Loader.load以GObjectIntrospection::Loader的super(Parquet, Parquet)方式加载Parquet命名空间随后在post_load中加载一系列 Ruby 增强模块如arrow-file-reader、arrow-table-loadable、arrow-table-savable、writer-properties。当前仓库中该 gem 的版本号定义为17.0.0-SNAPSHOT见 lib/parquet/version.rb。安装先装 Apache Parquet GLib再装 Red ParquetRed Parquet 是 Apache Parquet GLib 的 Ruby 绑定因此安装顺序有严格要求先安装 Apache Parquet GLib以及其依赖的 Apache Arrow C/GLib 运行时。GLib 是 Red Parquet 赖以工作的底层 C 库缺少它 Ruby 绑定将无法加载。再安装 Red Parquet gem% gem install red-parquet注意red-parquet.gemspec 声明了运行时依赖red-arrow且要求版本与本 gem 完全一致spec.add_runtime_dependency(red-arrow, #{spec.version})。也就是说安装 Red Parquet 时会自动带上与它同版本的 red-arrow gem而 red-arrow 负责提供Arrow::Table、Arrow::Schema等核心对象模型。此外 gemspec 中的spec.extensions [dependency-check/Rakefile]表明安装时会执行依赖检查任务见 dependency-check/Rakefile确保底层 GLib 库就绪。开发调试时也可以直接在本仓库的ruby/red-parquet目录下通过rake运行测试套件默认任务即:test先执行dependency-check再运行test/run-test.rb参考 Rakefile。基础用法一行读取、一行保存README 给出的最小可用示例非常直观require parquet table Arrow::Table.load(/dev/shm/data.parquet) # Process data in table table.save(/dev/shm/data-processed.parquet)其中Arrow::Table.load(path)按 Parquet 格式读取文件返回Arrow::Table对象在内存中完成数据处理如筛选、变换、聚合这些能力来自 red-arrowtable.save(path)再把处理结果写回新的 Parquet 文件。读取链路解析Table.load 到底做了什么Arrow::Table.load的 Parquet 分支由 lib/parquet/arrow-table-loadable.rb 实现Red Parquet 通过module Parquet::ArrowTableLoadable以include方式挂接到Arrow::TableLoader上load_as_parquet方法被注册为私有的加载入口。核心逻辑如下def load_as_parquet open_input_stream do |input| reader Parquet::ArrowFileReader.new(input) reader.use_threads (options[:use_threads] ! false) table reader.read_table table.instance_variable_set(:input, input) table end end几个值得注意的细节底层读取器Parquet::ArrowFileReader是 Apache Parquet GLib 中GParquetArrowFileReader的 Ruby 绑定其use_threads属性对应 GLib 的gparquet_arrow_file_reader_set_use_threads见 c_glib/parquet-glib/arrow-file-reader.cpp最终调用 Parquet C 的set_use_threads决定是否启用多线程并行解码。use_threads 选项默认开启options[:use_threads] ! false只有显式传入use_threads: false才会关闭在需要严格单线程执行或调试场景下可用。读取完成后输入流对象会被暂存在 table 实例上input保证数据访问期间底层资源不被回收。写入链路解析Table.save 与 WriterProperties 配置写入路径由 lib/parquet/arrow-table-savable.rb 实现Red Parquet 通过Arrow::TableSaver挂接save_as_parquet。这段代码是理解全部写入选项的钥匙def save_as_parquet properties WriterProperties.new options.each do |key, value| next if value.nil? set_method_name set_#{key} next unless properties.respond_to?(set_method_name) case value when ::Array, ::Hash value.each do |path, v| properties.__send__(set_method_name, v, path) end else properties.__send__(set_method_name, value) end end chunk_size options[:chunk_size] || table.n_rows open_raw_output_stream do |output| ArrowFileWriter.open(table.schema, output, properties) do |writer| writer.write_table(table, chunk_size) end end end这里的关键机制是Table.save的命名选项会被动态映射为WriterProperties#set_*方法。properties.respond_to?(set_method_name)保证了只有底层真实支持的选项才会生效。可用的set_*方法集来自 Apache Parquet GLib 的GParquetWriterProperties见 c_glib/parquet-glib/arrow-file-writer.cpp其内部持有一个parquet::WriterProperties::Builder包括但不限于Ruby 选项对应 GLib / Parquet 底层能力说明compressiongparquet_writer_properties_set_compressionL102-L115设置列压缩算法可传全局值或按列路径点分字符串分别指定dictionaryenable_dictionary/disable_dictionaryL143-L174控制字典编码set_dictionary包装见 lib/parquet/writer-properties.rbdictionary_page_size_limitdictionary_pagesize_limitL201-L208字典页大小上限batch_sizewrite_batch_sizeL233-L240写批次大小max_row_group_lengthmax_row_group_lengthL264-L271单个行组row group的最大行数data_page_sizedata_page_sizeL289 起数据页大小其中compression与dictionary两个选项支持传入Array或Hash此时会按“列路径 → 值”逐列配置传入标量则全局生效。chunk_sizewrite_table的分块大小默认取table.n_rows即一次写完整个表可显式传入chunk_size: N控制每次写入的行数从而影响行组划分与内存占用。写入器Parquet::ArrowFileWriter.open对应 GLib 的gparquet_arrow_file_writer_open见 c_glib/parquet-glib/arrow-file-writer.cpp未传writer_properties时使用parquet::default_writer_properties()默认属性。实测可用的写入选项来自测试用例仓库测试 test/test-arrow-table.rb 验证了以下写读组合均可作为实战参考# 保存到文件路径 table.save(output.path) # 保存到内存 Buffer需显式指定格式 buffer Arrow::ResizableBuffer.new(1024) table.save(buffer, format: :parquet) Arrow::Table.load(buffer, format: :parquet) # 全局压缩 table.save(output.path, compression: :zstd) # 按列压缩count 列用 zstd table.save(output.path, compression: {count :zstd}) # 关闭字典编码 table.save(output.path, dictionary: false) # 按列控制字典编码label 列关闭 table.save(output.path, dictionary: [[label, false]])这些测试还展示了Arrow::Schema、Arrow::ChunkedArray与Arrow::Table.new(schema, arrays)构造数据的方法以及用equal_metadata断言写读前后的元数据一致性。行组级细粒度读取each_row_group对于大文件逐行组读取能显著降低内存峰值。Red Parquet 在 lib/parquet/arrow-file-reader.rb 中为Parquet::ArrowFileReader补充了each_row_group方法def each_row_group return to_enum(__method__) {n_row_groups} unless block_given? n_row_groups.times do |i| yield(read_row_group(i)) end end传入块时逐行组 yieldArrow::Table不传块时返回 Enumerator并预先告知size为n_row_groups方便链式调用。n_row_groups与read_row_group(i)均由 GObject Introspection 自动绑定到 GLib 读取器。测试 test/test-arrow-file-reader.rb 演示了用chunk_size 1写入两行数据再通过each_row_group精确取回两个各含一行的行组验证了行组边界与写入 chunk 的对应关系。元数据与统计信息Parquet::BooleanStatistics 的命名修正Parquet 列块携带的统计信息min/max可用于谓词下推等查询优化。Red Parquet 通过 lib/parquet/loader.rb 中的load_method_info对Parquet::BooleanStatistics做了特殊处理when Parquet::BooleanStatistics case method_name when min? method_name min when max? method_name max end由于布尔统计的min/max与 Ruby 的Enumerable#min/#max重名GObject Introspection 自动绑定时会将其命名为min?/max?Red Parquet 在加载时又改回min/max保证 API 简洁自然。配套测试 test/test-boolean-statistics.rb 展示了读取统计信息的完整路径reader Parquet::ArrowFileReader.new(file.path) statistics reader.metadata.get_row_group(0).get_column_chunk(0).statistics assert_equal(false, statistics.min) assert_equal(true, statistics.max)常见注意事项与适用前提运行环境Red Parquet 依赖系统级的 Apache Parquet GLib 与 Apache Arrow 运行库纯 Ruby 环境无法独立工作安装顺序必须是“GLib 优先gem 其次”。版本一致性red-parquet 与 red-arrow 的 gem 版本必须严格一致gemspec 中的约束混用不同版本可能导致 API 不匹配。格式识别Table.load(path)对.parquet后缀文件走 Parquet 加载分支当读写内存Buffer时需要显式传入format: :parquet见测试用例这一点与 red-arrow 的多格式加载体系保持一致。性能取舍读取默认启用多线程use_threads写入可按列配置压缩如:zstd与字典编码这些选项在save/load层面即可完成无需深入 C 层。结语Red Parquet 以 GObject Introspection 为纽带把 Apache Parquet C 的列式存储能力无缝接入 Ruby 生态。通过本文梳理的安装流程、Table.load/Table.save读写链路、WriterProperties动态选项机制、each_row_group行组遍历与统计信息 API你已经可以在 Ruby 项目中直接完成 Parquet 文件的读写、压缩与字典编码配置。若需进一步深入建议继续阅读仓库中的 c_glib/parquet-glib 源码与 ruby/red-parquet/test 下的测试用例它们是最贴近真实行为的实现参照。赞分享数据工程大数据序列化数据分析【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow13/arrow点击查看免费下载相关推荐Red Parquet 使用指南在 Ruby 中读写 Apache Parquet 列式存储文件Red Parquet 使用指南在 Ruby 中读写 Apache Parquet 列式存储文件 Red Parquet 是 Apache Parquet 列数据工程数据分析大数据Apache Arrow red-parquet 详解基于 GObject Introspection 的 Ruby Parquet 读写绑定Apache Arrow red parquet 详解基于 GObject Introspection 的 Ruby Parquet 读写绑定 red par大数据数据分析数据工程序列化parquet-go 深度解析用 Go 高效读写 Apache Parquet 列式文件parquet go 深度解析用 Go 高效读写 Apache Parquet 列式文件 导读 Apache Parquet 是当前大数据生态中事实标准的列式开发工具包管理器CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表