#数组 #Apache Arrow #Arrow #操作 #排序 #算术 #计算

arrow2

Apache Arrow 规范的非官方安全 Rust 实现

38 个版本 (17 个破坏性更新)

0.18.0 2023年9月17日
0.17.3 2023年7月15日
0.17.0 2023年3月27日
0.15.0 2022年12月18日
0.2.0 2021年7月30日

#1812编码

Download history 9129/week @ 2024-04-11 9132/week @ 2024-04-18 8614/week @ 2024-04-25 8019/week @ 2024-05-02 11713/week @ 2024-05-09 11099/week @ 2024-05-16 12617/week @ 2024-05-23 13644/week @ 2024-05-30 16155/week @ 2024-06-06 18649/week @ 2024-06-13 18281/week @ 2024-06-20 23637/week @ 2024-06-27 21515/week @ 2024-07-04 17322/week @ 2024-07-11 26743/week @ 2024-07-18 23364/week @ 2024-07-25

每月下载量:93,277
用于 113 个crate (直接使用33个)

Apache-2.0

2.5MB
57K SLoC

Arrow2: 无转换的 Arrow

test codecov

一个用于与 Apache Arrow 一起工作的 Rust crate。在 C++ 实现(参考实现)之后,是功能最完整的 Arrow 格式实现。

查看 指南 了解如何使用此 crate,以及 API 文档 了解其每个 API 的详细说明。

功能

  • 在参考实现(C++)之后,Apache Arrow 的功能最完整的实现
    • 不支持十进制 256(不是 Rust 原生类型)
  • 支持所有 Arrow 类型(读取和写入)的 C 数据接口
  • 支持所有 Arrow 类型的 C 流接口(读取和写入)
  • 与 Rust 的 Vec 完全兼容
  • 支持使用位图和数组原地操作的 MutableArray API
  • 完全支持带时区的日期时间,包括考虑时区的算术运算
  • 支持从、写入
    • CSV
    • Apache Arrow IPC(所有类型)
    • Apache Arrow Flight(所有类型)
    • Apache Parquet(除了深度嵌套类型)
    • Apache Avro(所有类型)
    • NJSON
    • ODBC(一些类型)
  • 广泛的计算操作套件
    • 聚合
    • 算术运算
    • 类型转换
    • 比较
    • 排序和归并排序
    • 布尔(AND、OR 等)和布尔 Kleene
    • 过滤、获取
    • 哈希
    • if-then-else
    • nullif
    • 时间(天、月、星期几、小时等)
    • 窗口
    • ...等等...
  • 广泛的 cargo 功能标志集,以减少编译时间和二进制文件大小
  • 在 CPU 限制和 I/O 限制任务之间完全解耦的 IO,允许此 crate 在 async 上下文中使用而不阻塞,并利用并行性
  • 已知最快的 Avro 和 Parquet 实现(例如,比官方 C++ 实现更快)

安全性和安全性

当绝对必要的时候,这个crate会使用unsafe

  • 编译器无法证明某些不变性时
  • FFI(外部函数接口)

我们对这些进行了广泛的测试,所有测试都在MIRI下运行并通过。大多数使用unsafe的情况可以分为3类

  • Arrow格式在UTF-8上有一些不能在安全Rust中写入的不变性
  • TrustedLen和特化特性仍然是nightly特性
  • FFI(外部函数接口)

我们积极监控Rust的漏洞公告,并对其进行修复或缓解(例如,参见.cargo/audit.yaml.github/workflows/security.yaml)。

从不可信数据读取目前可能在以下格式中可能引发panic!

  • Apache Parquet
  • Apache Avro

我们正在积极解决这个问题。

集成测试

我们的测试包括对以下内容的往返测试

  • 由C++、Java、Go、C#和JS实现生成的Apache Arrow IPC(既有小端也有大端)
  • 由Arrow的C++和Spark的实现生成的Apache Parquet格式(在其不同的配置中)
  • 由官方Rust Avro实现生成的Apache Avro

查看DEVELOPMENT.md以获取我们的开发实践。

版本控制

我们使用与Cargo和Rust生态系统剩余部分相同的SemVer 2.0,我们还使用0.x.y版本控制,因为我们正在迭代API。

设计

这个repo和crate的主要目标是提供一个安全Rust的Arrow规范实现。因此,它

  • 不得实现arrow规范中定义之外的其他逻辑类型,schema.fbs
  • 必须根据arrow规范来布局内存
  • 必须支持在零拷贝模式下从C数据接口读取和写入
  • 必须支持从,和写入,IPC规范,它必须与IPC规范进行验证,这些规范可以在这里找到。

关于本repo各个部分的详细设计文档可在各自的README中找到。

常见问题解答

是否有与Apache Arrow项目合并的计划?

也许吧。创建这个repo和crate的主要原因是能够使用基于无转换实现的根本不同的设计进行原型设计和成熟化。这需要破坏向后兼容性和丢失一些在Arrow repo上无法实现的功能。

此外,arrow项目目前有一个不适合这种类型工作的发布机制

  • Apache的一次发布是所有arrow格式实现的一次发布,版本相同。它目前处于5.0.0版本。

这意味着crate版本与变更日志或其API稳定性无关,这违反了SemVer。这个程序使crate与依赖SemVer来约束软件版本的Rust(和许多其他)生态系统不兼容。

其次,这意味着箭头存储库的版本为 >0.x。这为API稳定性设定了期望,与这项工作不兼容。

许可证

根据您选择的以下任一许可证授权:

供您选择。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义,您提交的任何旨在包含在工作中的贡献将根据上述条款双授权,没有任何附加条款或条件。

依赖项

~3–17MB
~236K SLoC