Red Arrow:基于 GObject Introspection 的 Apache Arrow Ruby 绑定安装与实战指南
Red Arrow基于 GObject Introspection 的 Apache Arrow Ruby 绑定安装与实战指南【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址: https://gitcode.com/gh_mirrors/arrow13/arrowApache Arrow 是一个面向内存列式数据in-memory columnar data的多语言工具箱被广泛用于数据分析场景中的高效数据交换与处理。Red Arrowred-arrowgem正是 Apache Arrow 官方的 Ruby 绑定它不直接调用 C 接口而是经由 Apache Arrow GLib 与 GObject Introspection 这两层“胶水”在运行时自动生成 Ruby 绑定从而让 Ruby 开发者可以用惯用的 Ruby 语法操作 Arrow 的 Table、RecordBatch、Array 等核心数据结构。本文以仓库中 ruby/red-arrow/README.md 为主线结合源码讲解安装流程、Table.load/Table.save的多格式读写能力、开发与测试方式帮助你在自己的 Ruby 项目中快速落地 Arrow 数据处理管线。Red Arrow 的架构定位三层桥接Red Arrow 之所以能在 Ruby 里操作 Apache Arrow靠的是一条明确的三层技术链Apache Arrow C底层高性能实现位于仓库 cpp 目录。GObject Introspection 无法直接消费 C 类型系统因此不能直接绑定 C。Apache Arrow GLib位于仓库 c_glib 目录是 Apache Arrow C 的 C 语言包装层。它为 C 提供了一套 GObject 化的 API作为 C 与 GObject Introspection 之间的桥。gobject-introspection gemGObject Introspection 的 Ruby 绑定可以在运行时读取 GLib 的 introspection 数据并自动生成 Ruby 绑定代码。Red Arrow 使用 Apache Arrow GLib 与 gobject-introspection gem 共同完成绑定生成二者缺一不可。从源码入口可以直观看到这一点ruby/red-arrow/lib/arrow.rb 在require arrow时依次加载require extpp/setup require gio2 require arrow/version require arrow/loader module Arrow class Error StandardError end Loader.load end其中Loader继承自GObjectIntrospection::Loader见 ruby/red-arrow/lib/arrow/loader.rb通过super(Arrow, Arrow)加载Arrow命名空间并在post_load中依次加载 Ruby 侧的补充实现require_libraries、原生扩展require_extension_library即arrow.so由 ext/arrow/arrow.cpp 等编译而来、GC 保护逻辑以及启动回调分发线程。安装 Red Arrow前置条件先安装 Apache Arrow GLibRed Arrow 是建立在 Apache Arrow GLib 之上的绑定因此安装顺序必须是先装 Apache Arrow GLib再装 Red Arrow。Arrow GLib 的安装方式随平台不同而异官方安装文档会按发行版给出对应包名与安装命令macOS 上常见的做法是通过 Homebrew 安装详见下文“开发环境搭建”小节。安装完成后验证 GLib 层可用再执行 gem 安装% gem install red-arrowgem 本身会自动携带其运行时依赖见 ruby/red-arrow/red-arrow.gemspecbigdecimal 3.1.0csvextpp 0.1.1用于扩展库的构建与加载gio2 3.5.0GObject Introspection 的 Ruby 绑定native-package-installer用于探测/安装系统原生包pkg-config用于编译时定位 GLib/Arrow 的头文件与库gemspec 中还通过spec.metadata[msys2_mingw_dependencies]声明了 WindowsMSYS2/MinGW环境下对arrow系统包的版本要求版本号取自 ruby/red-arrow/lib/arrow/version.rb 中定义的Arrow::Version当前仓库为17.0.0-SNAPSHOT。版本对应关系Red Arrow 的 gem 版本与 Apache Arrow 本身保持同步发布版本号由Arrow::Version::MAJOR.MINOR.MICRO.TAG拼接而成见 gemspec 中version_components.compact.join(.)。这意味着你需要安装与 red-arrow 版本匹配的 Apache Arrow GLib避免 API 不兼容。快速上手读写 Arrow 文件README 给出了最核心的用法——加载 Arrow 文件、处理数据、再保存回去require arrow table Arrow::Table.load(/dev/shm/data.arrow) # Process data in table table.save(/dev/shm/data-processed.arrow)这里require arrow会触发上述Loader.load的完整初始化流程。Arrow::Table.load与Arrow::Table.save是 Red Arrow 提供的高层入口分别委托给 ruby/red-arrow/lib/arrow/table-loader.rb 的TableLoader与 ruby/red-arrow/lib/arrow/table-saver.rb 的TableSaver见 ruby/red-arrow/lib/arrow/table.rb 中Table.load/Table.save的定义。按扩展名自动推断格式TableLoader与TableSaver都会先根据路径扩展名推断格式与压缩方式fill_options方法再选择对应的加载/保存策略。例如.arrow或没有可识别扩展名时默认按 Arrow 文件格式format: :arrow处理同时支持按需覆盖格式选项。底层load方法会判断输入类型URI 走load_from_uri_http/load_from_uri_https目录走load_from_directory其余走load_from_file。支持的文件格式从TableLoader与TableSaver的实现看Red Arrow 支持以下格式的读写对应load_as_*/save_as_*系列私有方法格式load 选项save 选项底层实现Arrow 文件Random Access:arrow/:arrow_file:arrow/:arrow_fileRecordBatchFileReader/RecordBatchFileWriterArrow 流式Streaming:arrow_streaming旧名:stream:arrow_streaming旧名:streamRecordBatchStreamReader/RecordBatchStreamWriterCSV:csv:csvCSVLoader/ RubyCSVTSV:tsv:tsvCSV 逻辑分隔符为\tFeather:feather:featherFeatherFileReader/write_as_featherJSON:json—JSONReaderJSONReadOptionsORC:orc—ORCFileReader仅当构建包含 ORC 支持时几点实现细节值得注意load_as_arrow会先尝试按 Arrow 文件读取失败后自动回退到流式读取load_as_arrows对历史数据兼容友好。旧格式名:batch、:stream已标记为 deprecatedREADME 与源码注释均建议改用:arrow_file/:arrow_streaming。读 CSV 时可通过 options 透传CSVLoader的配置如分隔符等load_as_tsv内部就是把delimiter强制设为\t。保存时如果指定compression选项open_output_stream会用Codec.new(compression)创建压缩编解码器并包装成CompressedOutputStream后再写入。通过 options 显式指定格式Table.load与Table.save都接受第二个 options 参数。例如强制按流式格式读取table Arrow::Table.load(data.arrows, format: :arrow_streaming) table.save(out.arrow, format: :arrow_file)从零构造 Table多种初始化方式除了从文件加载ruby/red-arrow/lib/arrow/table.rb 中的Table#initialize支持多种构造方式便于在内存中直接建表由 Hash 的列名到 Ruby 数组构造类型自动推断最简单table Arrow::Table.new(count [0, 2, nil, 4], visible [true, nil, nil, false])由Arrow::Column数组构造count_field Arrow::Field.new(count, :uint32) count_array Arrow::UInt32Array.new([0, 2, nil, 4]) count_column Arrow::Column.new(count_field, count_array) table Arrow::Table.new([count_column])由 Schema 原始记录raw records构造schema {count: :uint32, visible: :boolean} raw_records [[0, true], [2, nil], [nil, nil], [4, false]] table Arrow::Table.new(schema, raw_records)此外还支持HashString, Arrow::Array、HashString, Arrow::ChunkedArray、Schema 列/数组/RecordBatch 等多种组合实现会自动做类型转换并调用底层initialize_raw。表处理能力切片、合并、排序与聚合Table混入了多个能力模块见 ruby/red-arrow/lib/arrow/table.rb 顶部的 include 列表ColumnContainable按列访问、查找列GenericFilterable布尔数组/掩码过滤GenericTakeable按索引取子集InputReferable输入生命周期引用管理share_inputRecordContainableRecord 级访问行切片 sliceslice支持非常丰富的参数形态整数索引返回单个Record、(offset, length)、Range、布尔掩码数组、条件 Hash内部用Slicer构造、、等条件并做 AND 合并甚至支持 block 形式配合Slicer编写条件。实现中还对负数索引做了归一化处理。连接 joinTable#join自 7.0.0 起提供支持自然连接、单键连接、多键连接与键重命名left_suffix/right_suffix底层通过ExecutePlan构建 source 节点、HashJoinNodeOptions哈希连接节点与 sink 节点最后从 sink 读取结果表left_outputs/right_outputs可控制输出列。排序与聚合group、window、排序选项SortOptions/SortKey等能力也在 Ruby 侧提供了面向对象封装见 ruby/red-arrow/lib/arrow/group.rb、ruby/red-arrow/lib/arrow/rolling-window.rb 等可用惯用的 Ruby 风格进行分组聚合分析。底层读取示例RecordBatch 级遍历README 只给出了高层Table.load用法。如果需要对大数据分块处理可以像 ruby/red-arrow/example/read-file.rb 那样直接使用MemoryMappedInputStreamRecordBatchFileReader逐批读取 RecordBatchrequire arrow Arrow::MemoryMappedInputStream.open(/tmp/file.arrow) do |input| reader Arrow::RecordBatchFileReader.new(input) fields reader.schema.fields reader.each_with_index do |record_batch, i| puts( * 40) puts(record-batch[#{i}]:) fields.each do |field| field_name field.name values record_batch.collect do |record| record[field_name] end puts( #{field_name}: #{values.inspect}) end end end仓库 ruby/red-arrow/example 下还提供了read-stream.rb、write-file.rb、write-stream.rb、read-pipe.rb、write-pipe.rb等示例覆盖流式读写与管道pipe传输场景可作为进一步学习的起点。开发与测试从源码构建 Red ArrowREADME 指出若要从源码开发 Red Arrow需要先在 master 上安装 Apache Arrow C 与 Apache Arrow GLib然后在仓库内执行$ cd ruby/red-arrow $ bundle install $ bundle exec rake test其中bundle install依据 ruby/red-arrow/Gemfile 安装开发依赖test-unit、rake、yard、benchmark-driver等。rake test任务会运行 ruby/red-arrow/test/run-test.rb测试套件覆盖 Array、Table、RecordBatch、Schema、各种数据类型的 ArrayBuilder、CSV/Feather/ORC 读写、排序test-sort-indices.rb、表达式test-expression.rb等主题。Rakefile中还定义了compile、configure、benchmark与yard等任务其中 benchmark 任务通过benchmark-driver读取 ruby/red-arrow/benchmark 下的 YAML 配置raw-records/values两组来评估各数据类型的性能。macOS 与 HomebrewmacOS 上推荐使用 Homebrew 安装两个--head版本的原生包以确保与仓库 master 代码兼容$ cd ruby/red-arrow $ bundle install $ brew install apache-arrow --head $ brew install apache-arrow-glib --head $ bundle exec rake test安装顺序上bundle install在前、brew 装原生库在后也可以但务必保证两条 brew 安装命令都执行且版本与 red-arrow 匹配--head即构建当前开发版。小结Red Arrow 通过“Apache Arrow C → Apache Arrow GLib → gobject-introspection gem → Red Arrow”这条桥接链为 Ruby 带来了完整的 Arrow 内存列式数据能力。从 README 的安装与最小用法出发你可以在 lib/arrow 中探索 Table 的多格式加载/保存、多种建表方式、切片/连接/排序/聚合等能力在 example 中看到 RecordBatch 级读写示例在 test 中查阅与源码同步的测试用例。无论你是想用 Ruby 读取 Arrow/Feather/CSV 数据、构建分析管线还是跨语言共享列式数据Red Arrow 都提供了一条开箱即用的路径。【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址: https://gitcode.com/gh_mirrors/arrow13/arrow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考