处理 Arrow 代码库 🧐#

了解 Arrow 的组织结构#

Apache Arrow 仓库包含了 Arrow 可用的绝大多数库的实现。

诸如 GLib (c_glib/), C++ (cpp/), C# (csharp/), JavaScript (js/), MATLAB (matlab/), Python (python/), R (r/) 和 Ruby (ruby/) 之类的语言,都有它们自己的子目录,就像这里写的一样,都在主目录下。

以下语言的实现有它们自己的仓库

特定于语言的子目录 中,你可以找到与该语言相关的代码。例如:

  • python/ 文件夹包含 pyarrow/ 文件夹,其中包含 pyarrow 包的代码和构建 pyarrow 所需的 requirements 文件。

    pyarrow/ 包含 Python 和 Cython 代码。

    pyarrow/ 还包含 test/ 文件夹,其中包含 pyarrow 模块的所有测试。

  • r/ 目录包含 R 包。

arrow 仓库中包含的其他子目录有:

  • ci/ 包含各种持续集成 (CI) 作业使用的脚本。

  • dev/ 包含对开发人员在打包、测试或提交到 Arrow 时有用的脚本,以及扩展持续集成 (CI) 任务的定义。

  • .github/ 包含在 GitHub 持续集成 (CI) 上运行的工作流程,由某些操作(例如打开 PR)触发。

  • docs/ 包含大部分文档。阅读更多关于 帮助完善文档

  • format/ 包含 Arrow 列式格式和项目的其他部分(如 Flight RPC 框架)的二进制协议定义。

绑定、功能、修复和测试#

你可以阅读本节,以获取有关如何解决你遇到的库问题的想法。

根据你要解决的问题(添加简单绑定、添加功能、编写测试等),有不同的方法来获取必要的信息。

对于所有情况,你可以通过某种搜索工具来搜索函数。根据我们的经验,有两种好的方法:

  1. 通过 Arrow 仓库(而不是 Fork 的仓库)中的 GitHub 搜索。 这种方式很好,因为 GitHub 允许你搜索函数定义和引用。

  2. 你选择的 IDE

绑定

术语“绑定”用于指代 C++ 实现中的一个函数,该函数可以从另一种语言中的函数调用。 在 C++ 中定义一个函数后,我们必须手动创建绑定,以便在该实现中使用它。

注意

通过检查类似问题的 Pull Request单元测试,你可以学到很多东西。

在 Python 中添加修复

如果你要更新现有函数,最简单的方法是以交互方式运行 Python 或运行 Jupyter Notebook,并研究该问题,直到你了解需要做什么。

之后,你可以在 GitHub 上搜索函数名称,以查看函数在何处定义。

此外,如果产生错误,这些错误很可能会将你指向需要查看的文件。

Python - Cython - C++

在处理 Python 问题时,你很可能会遇到 Cython 代码。不太可能需要更新 C++ 代码,尽管这种情况可能会发生。

如前所述,底层代码是用 C++ 编写的。 然后 Python 通过 Cython 连接到它。 如果你不熟悉它,你可以寻求帮助,并记住,寻找类似的 Pull Request 和 GitHub 问题!

添加测试

在某些问题中,仅缺少测试。 在这里,你可以搜索类似的函数,并查看这些函数的单元测试是如何编写的,以及它们如何在你的情况下应用。

这对于为你已解决的问题添加测试也是如此。

新功能

如果你要在 Python 中添加一个新功能,你可以查看 教程 以获取想法。

R 绑定的哲学

在编写 C++ 计算函数和 R 函数之间的绑定时,目的是通过与现有 R 函数相同的接口公开 C++ 功能。