我们很高兴地宣布在 Apache Arrow 项目中正式支持 Julia 语言。自从 Arrow 格式 1.0 版本发布 以来(2020 年 7 月),一直有人呼吁在 Julia 中提供支持。虽然 Julia 很早就支持了原始的 feather v1 格式,但对“升级版”Arrow 格式的支持被推迟了,因为该格式还在不断成熟,并且需要找到合适的方法和资源来支持它。
最初的代码 已于去年 11 月(2020 年)合并到 Apache Arrow 的主分支中,并且自那时起,对包 API 和错误修复的迭代一直在快速进行。虽然大多数语言实现都位于 apache/arrow 单仓库 中,但 Julia 包的初始工作是在 JuliaData/Arrow.jl 仓库 中完成的。该代码仍在 Arrow.jl 仓库中积极开发,并会在 Apache Arrow 项目本身的重大版本发布时将其快照合并到“上游”。用户可以选择安装官方的 Apache Arrow Julia 代码,或者在 Arrow.jl 仓库中跟踪相同代码库的最新版本。
Arrow 格式是过去 30 年中许多格式创新的现代积淀。它将实际数据存储在二进制表示中,这样可以避免在进程之间或从磁盘到磁盘传递数据时进行昂贵的序列化/反序列化计算。它使用 google flatbuffers 格式 存储有关数据的重要元数据,包括列名、类型和其他重要元数据。
Arrow 格式的 Julia 实现是用纯 Julia 编写的。它为引用符合 Arrow 标准的数据提供了 Julia 的 AbstractVector
对象。这使得用户可以将 Arrow 格式的数据与大量现有的 Julia 代码无缝连接。一个关键的集成是通过 Tables.jl 接口 为 Arrow.Stream
和 Arrow.Table
对象提供的支持,这使得它可以与 越来越多的集成 无缝集成,包括:DataFrames.jl、JSONTables.jl、JuliaDB.jl、SQLite.jl、MySQL.jl、JDBC.jl、ODBC.jl、XLSX.jl 等等。
为了进一步说明这一点,Arrow 格式在 Julia 中的“可访问性”确实非常强大。例如,读取 Arrow 格式的 IPC 流或文件的代码如下:
# read an arrow formatted file or IPC stream given as a Vector{UInt8}
tbl = Arrow.Table(file_or_ipc_stream)
# access the column named "col1"
col = tbl.col1
在这个例子中,col
对象是一个自定义的 AbstractArray
类型,它提供了一个对原始 Arrow 内存的“视图”;也就是说,不会进行数据的复制或实例化,但 Arrow 内存可以通过 Base Julia 提供的强大的 AbstractArray
接口访问。这意味着像 sum
、count
、map
或 filter
这样的 数组函数,或者由 Statistics stdlib 提供的像 mean
、std
、median
或 cor
这样的函数,都可以“直接”在这些自定义的 Arrow.jl 数组类型上使用,而无需重新实现 所有这些功能 本身。
Julia 实现的另一个令人印象深刻的地方是它已经支持了大量的格式,包括
所有基本数据类型(包括 Decimal256)
所有嵌套数据类型
字典编码、嵌套字典和消息
扩展类型
流、文件、记录批处理以及替换和 isdelta 字典消息
它目前不支持
张量或稀疏张量
Flight RPC
C 数据接口
它还默认支持多线程读写、内存压缩/解压缩,并强烈支持将数据分区到记录批处理中。对于后者,Arrow.jl 在写入时支持 Tables.partitions
接口,这意味着它将接受输入数据的任何数据分区,并将每个分区作为一个单独的记录批处理写入 Arrow 格式。
我们很高兴看到在 Julia 中使用 Arrow 格式的进一步进展;就目前而言,我们认为 Julia 实现是 Arrow 格式最简单、最强大、最灵活的实现之一。能够以交互方式与 Arrow 数据集交互以进行探索、与其他许多格式轻松集成以及对数据进行原样处理,对于任何处理数据的人来说都是一个强大的工具。
如果您有兴趣了解更多信息,请查看 包文档 或 格式文档;此外,欢迎随时加入 #data Slack 频道 提问或聊天,或者在数据讨论区 创建新主题。祝您 Arrow 操作愉快!
感谢 JuliaHub(前身为 Julia Computing)赞助 Julia 实现的工作。