Apache Arrow GLib(C)深入指南:基于 GObject 的 C++ 封装、GObject Introspection 与多语言实战

发布时间:2026/9/24 3:00:30

Apache Arrow GLib(C)深入指南:基于 GObject 的 C++ 封装、GObject Introspection 与多语言实战 数据工程大数据序列化数据分析【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow13/arrow点击查看免费下载Apache Arrow GLib 是 Apache Arrow 在 C 语言生态中的官方绑定层它以 GLib/GObject 惯用法重新包装 Arrow C对外提供稳定的 C API并借助 GObject IntrospectionGI自动生成 Ruby、Lua、Python 等语言的运行时绑定。本文以仓库中的 docs/source/c_glib/index.md 为骨架结合 c_glib/README.md、Meson 构建配置与c_glib/下的真实源码与示例完整讲解其架构定位、模块全景、构建安装、C 语言使用、语言绑定与单元测试让读者既能直接上手编译运行也能理解 GI 机制在底层如何工作。Arrow GLib 是什么给 C 语言一套「可自省」的 Arrow APIApache Arrow GLib 是 Apache Arrow C 的包装库wrapper library它为 Arrow C 提供了完整的 C API。正如 docs/source/c_glib/index.md 所述Arrow GLib 的核心价值有两点面向 C 的稳定接口把 Arrow C 的模板化、命名空间化的 C 类型映射为以GArrow为前缀的 GLib 对象如GArrowArray、GArrowRecordBatch、GArrowSchema并遵守 GLib 的引用计数、GError错误传递与信号机制支持 GObject Introspection这意味着你可以在运行时或编译时自动生成语言绑定无需为每种语言手工维护一套绑定代码。在源码层面这种包装关系清晰可见c_glib/arrow-glib/arrow-glib.h 是 C 使用者的统一入口头文件它先引入glib-object.h再依次聚合数组、构建器、数据类型、计算、表达式、内存池、RecordBatch、Schema、Table、输入输出流、IPC Reader/Writer、文件系统等全部子模块头文件。所有包装类型通过 GLib 的G_DECLARE_*_TYPE宏声明例如 c_glib/arrow-glib/reader.h 中的GArrowRecordBatchFileReader底层则持有对应的arrow::RecordBatchReader等 C 对象指针实现「C 壳 C 核」的经典模式。依托 GObject Introspection 的绑定生成机制Arrow GLib 并不要求调用方直接面对 C 函数。GObject Introspection 会从GArrow*类型与函数导出GIRGObject Introspection Repository元数据即.gir文件与编译后的.typelib语言绑定库如 Ruby 的gobject-introspectiongem、Lua 的 LGI、Python 的 PyGObject读取这些元数据后即可在运行时把 C 类型映射为对应语言的对象。c_glib/README.md给出的 Ruby 示例直观展示了「运行时生成绑定」的效果# Generate bindings at runtime require gi Arrow GI.load(Arrow) # Now, you can access arrow::BooleanArray in Arrow C by # Arrow::BooleanArray p Arrow::BooleanArray也就是说GI.load(Arrow)一行代码之后Ruby 中就能以Arrow::BooleanArray直接操作 C 的arrow::BooleanArray。c_glib/README.md同时指出在 Ruby 场景下应优先使用基于该 gem 的red-arrow它在原生绑定之上补充了大量便捷特性。这套元数据由构建系统自动生成c_glib/meson.build中通过 Meson 的gnome模块以nsversion: 1.0生成并安装 GIR/typelibgir_dir .../datadir/gir-1.0而 c_glib/doc/arrow-glib.toml.in 则声明了ArrowCUDA-1.0、ArrowDataset-1.0、ArrowFlight-1.0、ArrowFlightSQL-1.0、Gandiva-1.0、Parquet-1.0等关联命名空间构成完整的 GLib 家族元数据图谱。GLib 家族模块全景docs/source/c_glib/index.md的核心是一份 API 参考手册导航它列出了 Arrow GLib 家族的全部成员。每个模块在 c_glib/ 下都有独立子目录并与 Arrow C 的对应能力一一对应文档入口docs 源源码目录对应 Arrow C 能力Apache Arrow GLibc_glib/arrow-glib/核心数据结构Array、RecordBatch、Schema、Table、IPC、计算、文件系统等Apache Arrow CUDA GLibc_glib/arrow-cuda-glib/GPUCUDA内存与设备间传输Apache Arrow Datasetc_glib/arrow-dataset-glib/Dataset/Scanner 分区数据集读取Apache Arrow Flight GLibc_glib/arrow-flight-glib/Flight RPC 客户端与服务端Apache Arrow Flight SQL GLibc_glib/arrow-flight-sql-glib/Flight SQL 协议客户端与服务端Apache Parquet GLibc_glib/parquet-glib/Parquet 文件读写与元数据Gandiva GLibc_glib/gandiva-glib/表达式编译与向量化求值这些子模块并不是无条件编译的从 c_glib/meson.build 可以看出构建时通过dependency()/find_library()探测 Arrow C 的arrow-dataset、arrow-flight、arrow-flight-sql、gandiva、parquet、arrow-cuda等库是否可用只有对应依赖存在时才进入相应子目录构建如arrow_cuda.found()时才subdir(arrow-cuda-glib)。其中arrow-acero是强制依赖arrow-orc则通过编译探测判断。这意味着 Arrow GLib 的安装形态会根据本地 Arrow C 的编译选项而增减模块与官方文档导航中的模块列表保持一致。构建与安装 Arrow GLib官方推荐直接使用发行版软件包安装指引见 Apache Arrow 官方安装页本文重点说明仓库内自带的两种构建路径面向用户的稳定源码包构建与面向开发者的源码树构建。两者都基于Meson Ninja。前置条件先装好 Arrow CArrow GLib 是对 Arrow C 的包装因此第一步必须是构建并安装 Arrow Cmake install或cmake --build ... --target install。若缺失链接阶段会报cannot find -larrow。这是c_glib/README.md中列出的头号常见问题。用户构建使用发布源码包用户应从官方发布源码包构建以 12.0.0 为例替换为实际版本号$ wget https://www.apache.org/dyn/closer.lua?actiondownloadfilenamearrow/arrow-12.0.0/apache-arrow-12.0.0.tar.gz \ --output-document apache-arrow-12.0.0.tar.gz $ tar xf apache-arrow-12.0.0.tar.gz $ cd apache-arrow-12.0.0macOS 需先安装依赖清单然后与其他平台一样执行$ brew bundle --filec_glib/Brewfile # 仅 macOS $ meson setup c_glib.build c_glib --buildtyperelease $ meson compile -C c_glib.build $ sudo meson install -C c_glib.build开发者构建在源码树内开发者需要额外的GTK-Doc用于生成 API 文档与GObject Introspection开发包。仓库 README 按发行版给出了安装命令Debian GNU/Linux / Ubuntusudo apt install -y -V gtk-doc-tools libgirepository1.0-dev meson ninja-buildCentOS 7sudo yum install -y gtk-doc gobject-introspection-devel ninja-build再用pip3安装 mesonCentOS 8 及以后sudo dnf install -y --enablerepopowertools gtk-doc gobject-introspection-devel ninja-build同样pip3 install mesonmacOSHomebrewbrew bundle --filec_glib/Brewfile随后构建macOS 需先设置 XML catalog 环境变量$ export XML_CATALOG_FILES$(brew --prefix)/etc/xml/catalog # 仅 macOS $ meson setup c_glib.build c_glib -Dgtk_doctrue $ meson compile -C c_glib.build $ sudo meson install -C c_glib.build注意针对 macOS构建 Arrow GLib 时默认链接的是 Homebrew 安装的 Arrow C若 GLib 层与 C 库之间存在版本不匹配可能导致构建失败。此时应指向本地构建的 Arrow C用--cmake-prefix-path显式指定路径$ meson setup c_glib.build c_glib --cmake-prefix-path${arrow_cpp_install_prefix} -Dgtk_doctrueMeson 构建选项详解c_glib/meson_options.txt 定义了可用的构建选项开发者可按需组合选项类型/默认值说明arrow_cpp_build_dirstring默认空指定未安装的 Arrow C 构建目录用于直接链接本地构建产物arrow_cpp_build_typestring默认release传给 Arrow C 的-DCMAKE_BUILD_TYPE值doc/gtk_docboolean默认false是否生成文档gtk_doc为新的选项名要求 Meson ≥ 0.63.0source_referencestring默认mainGI-DocGen 生成文档时引用的源码 URL 分支/标签vapiboolean默认false是否额外生成 Vala 语言绑定需gobject-introspection-1.0存在其中arrow_cpp_build_dir对应meson.build中的逻辑若设置该选项Meson 会直接用find_library从{build_dir}/{build_type}目录定位libarrow、libarrow_acero等库并从../cpp/src引入头文件从而在不安装 Arrow C 的情况下完成构建。常见构建问题排查c_glib/README.md汇总了四类高频问题及解法cannot find -larrow确认 Arrow C 已make installLinux 上还需执行sudo ldconfig。unable to load .../chunk.xslmacOS设置export XML_CATALOG_FILES$(brew --prefix)/etc/xml/catalog。Symbol not found ... libsource-highlight.4.dylibmacOS升级source-highlightbrew upgrade source-highlight。测试时 typelib 加载失败dependent dylib rpath/... not foundmacOSArrow C 不能使用rpath安装名需以-DARROW_INSTALL_NAME_RPATHOFF重新构建并安装 Arrow C$ cmake -S cpp -B cpp.build -DARROW_INSTALL_NAME_RPATHOFF ... $ cmake --build cpp.build $ sudo cmake --build cpp.build --target install使用方式一纯 C APIC 语言使用者直接使用GArrow*系列 API。安装后API 参考文档默认位于/usr/local/share/gtk-doc/html/arrow-glib/若通过--prefix指定了安装前缀路径会随之变化。从文件读取 RecordBatchread-file.c 全流程解析c_glib/example/read-file.c 是官方提供的完整可运行示例演示了「内存映射文件 → 文件格式 Reader → 逐批读取并打印」的完整链路打开输入流garrow_memory_mapped_input_stream_new(input_path, error)创建GArrowMemoryMappedInputStream失败时打印error-message并释放创建文件格式 Readergarrow_record_batch_file_reader_new(GARROW_SEEKABLE_INPUT_STREAM(input), error)将输入流向上转型为GArrowSeekableInputStream后构造 Reader遍历读取先用garrow_record_batch_file_reader_get_n_record_batches()获取批数再对每一批调用garrow_record_batch_file_reader_read_record_batch(reader, i, error)输出列数据garrow_record_batch_get_n_columns()/garrow_record_batch_get_column_name()/garrow_record_batch_get_column_data()逐列取出GArrowArray再按garrow_array_get_value_type()返回的GArrowType分派到garrow_uint8_array_get_value()等类型化取值函数内存管理每个对象在用完后调用g_object_unref()释放符合 GLib 引用计数约定。对应 API 声明可参见 c_glib/arrow-glib/reader.hgarrow_record_batch_file_reader_new()、garrow_record_batch_file_reader_get_schema()、garrow_record_batch_file_reader_get_n_record_batches()等其中旧的garrow_record_batch_file_reader_get_record_batch()已标记为废弃应使用..._read_record_batch()。从流式格式读取read-stream.c与文件格式首尾含元数据可随机访问不同流格式按顺序串行传输。 c_glib/example/read-stream.c 展示了流式读取范式garrow_record_batch_stream_reader_new(GARROW_INPUT_STREAM(input), error)创建流 Reader然后循环调用garrow_record_batch_reader_read_next()当返回NULL且无错误时表示流结束stream_reader garrow_record_batch_stream_reader_new(GARROW_INPUT_STREAM(input), error); reader GARROW_RECORD_BATCH_READER(stream_reader); while (TRUE) { record_batch garrow_record_batch_reader_read_next(reader, error); if (error) { /* 处理读取错误 */ } if (!record_batch) { break; } /* 流结束 */ print_record_batch(record_batch); g_object_unref(record_batch); }扩展类型示例extension-type.cc_glib/example/extension-type.c 进一步演示了 GLib 面向对象能力的运用通过G_DECLARE_DERIVABLE_TYPEG_DEFINE_TYPE从GArrowExtensionArray与GArrowExtensionDataType派生自定义的 UUID 数组/类型并实现get_extension_name()、equal()、deserialize()等虚函数——这是把 Arrow 扩展类型机制接入 GI 对象体系的完整样板。使用方式二基于 GI 的多语言绑定除 C 外Arrow GLib 的 GI 元数据让以下语言可以共享同一套 API 语义Ruby使用 red-arrow gem见 ruby/red-arrow/ 目录基于gobject-introspectiongem 并增加便捷封装Python使用 PyGObject注意Python 场景官方更推荐功能更完整的 PyArrow而非 Arrow GLib 绑定Lua使用 LGIc_glib/example/lua/README.md 提供了write-file.lua、read-file.lua、write-stream.lua、read-stream.lua四个示例安装方式为sudo apt install luarocks sudo luarocks install lgiGo使用 go-gir-generator同样Go 场景官方更推荐 go/arrow 原生实现Vala构建时开启-Dvapitrue可生成 Vala 的.vapi绑定。可以看出Arrow GLib 的价值在于一套 C API 覆盖多语言对于已有 C 调用栈、或希望以最小成本接入 GI 生态语言的项目它避免了为每种语言重复实现核心数据结构。运行单元测试验证安装c_glib/test/下存放着以 Ruby test-unit 编写的全部单元测试覆盖 Array、DataType、Scalar、RecordBatch、Table、计算、文件系统、CUDA、Parquet 等全部模块。运行测试前需安装 Ruby、gobject-introspectiongem 与test-unitgemDebian/Ubuntusudo apt install -y -V ruby-dev然后sudo gem install bundler并在c_glib目录执行bundle installCentOS 7README 给出了基于 rbenv 安装最新版 Ruby 的完整步骤macOS(cd c_glib bundle install)即可。在构建目录中执行测试run-test.sh会自动把各模块构建目录加入LD_LIBRARY_PATH/DYLD_LIBRARY_PATH并设置 typelib 目录见 c_glib/test/run-test.sh$ cd c_glib.build $ BUNDLE_GEMFILE../c_glib/Gemfile bundle exec ../c_glib/test/run-test.sh需要调试时可用DEBUGGER环境变量指定调试器$ DEBUGGERlldb BUNDLE_GEMFILE../c_glib/Gemfile bundle exec ../c_glib/test/run-test.sh此外c_glib/meson.build 已将test/run-test.sh注册为 Meson 的unit test因此也可以直接用meson test -C c_glib.build触发测试环境变量各模块 typelib 目录由构建系统自动注入。小结如何选择与上手总结而言Arrow GLib 在 Arrow 生态中的定位是**「面向 GLib/GObject 世界的官方 C 绑定层」**它把 Arrow C 的强大能力封装为标准的 GLib 对象模型并通过 GObject Introspection 让 Ruby、Lua、Python、Vala 等语言得以低成本复用同一套 API。上手路径也很清晰先安装与 GLib 匹配的 Arrow C再用 Meson 构建安装然后按需选择 C API参考 c_glib/example/ 示例或语言绑定最后以 Ruby 单元测试验证安装正确性。若你的目标语言已有更成熟的官方实现如 Python 的 PyArrow、Go 的原生 go/arrow应优先选择它们而当你需要 C 接口、Vala 绑定或 GI 生态集成时Arrow GLib 就是官方推荐的基础设施。赞分享数据工程大数据序列化数据分析【免费下载链接】arrowApache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing项目地址https://gitcode.com/gh_mirrors/arrow13/arrow点击查看免费下载相关推荐Apache Arrow GLibC 绑定指南基于 GObject Introspection 的 Arrow C C API 封装Apache Arrow GLibC 绑定指南基于 GObject Introspection 的 Arrow C C API 封装 Apache A数据工程数据分析大数据Apache Arrow GLib 实战指南基于 GObject Introspection 的 C 绑定与多语言桥接Apache Arrow GLib 实战指南基于 GObject Introspection 的 C 绑定与多语言桥接 本文以 Apache Arrow 仓库大数据数据分析数据工程序列化Apache Arrow GLib 实战指南用 C API 与 GObject Introspection 打通 Arrow C 与多语言生态Apache Arrow GLib 实战指南用 C API 与 GObject Introspection 打通 Arrow C 与多语言生态 Apach数据工程数据分析大数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/24 3:00:30

基于TinyUSB的STM32 U盘实现:从RAM Disk到SPI Flash完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 3:00:30

StarRocks 全面支持 Paimon 2.0:构建多模态统一分析与检索

作者:范振,StarRocks TSC Member;阿里云开源 OLAP 负责人StarRocks 对 Lakehouse 的投入已经持续多年。自 2023 年提出“From OLAP to Lakehouse”技术路线以来,社区持续完善对 Delta Lake、Iceberg、Paimon 等开放湖表的支持。数…

2026/9/24 3:00:30

论文里那个基础集合坍缩成一个基的bug,AI把论文变代码时在偷懒

你有没有想过一个问题:AI 现在写代码这么厉害,能不能直接把一篇学术论文变成一个能跑起来的代码仓库?听起来像是科幻片里的情节,但这件事已经有人在做了。而且做出来的结果,有点一言难尽。2024 年有一篇论文叫《Universal Neural …

2026/9/24 4:10:32

FreeMaster Recorder嵌入式实时数据捕获原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:10:32

量化回测工具选型指南:QMT、PTrade与开源框架对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:10:32

容器云原生架构落地:从PPT到kubectl可执行的硬性契约

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:10:32

TwinCAT 3搭建EtherCAT主站与伺服控制实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:10:32

K3s 详解:轻量级 Kubernetes 的架构、部署、局限性与应用场景

K3s 详解:轻量级 Kubernetes 的架构、部署、局限性与应用场景摘要:K3s 是面向边缘计算、资源受限环境、开发测试和中小规模生产集群的轻量级 Kubernetes 发行版。它保留 Kubernetes 的核心 API 和编排能力,同时简化安装并内置常用组件。本文系…

2026/9/24 4:05:32

SSM毕设选题推荐:基于 SSM 的课程视频上传管理系统的设计与实现 基于 SSM 的个性化视频学习平台【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码