5 个版本 (破坏性更新)

0.5.0 2023年2月6日
0.4.0 2022年1月26日
0.3.0 2022年1月25日
0.2.0 2022年1月24日
0.1.0 2022年1月19日

#1221 in 解析实现

自定义许可

395KB
9K SLoC

ORC 读取器,用于 Rust

Rust build status Java build status Coverage status

该项目包含用于从 Rust 编程语言处理 Apache ORC 文件的工具。

ORC 是一种开源数据格式,可以高效地表示数据表(类似于 CSV,但包含类型、压缩、索引等)。

请注意,此软件不是“开源”的,但源代码可供个人、非营利组织以及员工拥有的企业使用和修改(有关详细信息,请参阅下面的许可部分)。

示例用法

我最近一直在使用由 Twitter Stream Grab 发布的数据集,这是 Archive TeamInternet Archive 发布的,包括从 2011 年到 2021 年收集的数十亿条推文和 Twitter 用户资料。

Twitter Stream Grab 是 5.2 太字节压缩 JSON 数据,未压缩时约为 50 太字节。解析这些数据需要数百小时的计算时间,这使得个人项目或资源有限的行动主义团体重复处理变得不切实际。

存储如此多的数据也可能不切实际。我个人仅从 Internet Archive 服务器获取副本到柏林就花费了几百美元,目前在 S3 中存储(压缩)副本每月的费用约为 122 美元。

您可能希望从类似 Twitter Stream Grab 的数据中构建许多派生数据集和产品。一个例子是 数百万个 Twitter 用户资料快照集合,这些快照是 2020 年活跃传播关于选民欺诈错误说法的账户。我还运行了一个 网络服务,允许用户查找 Twitter 账户过去的用户名。

我正在使用ORC格式,使得从这些数据中构建类似的项目变得更加实用。基本思路是,您不必为每个应用程序重新处理整个50TB的JSON数据,而是只需要解析一次,将用户资料(以及其他信息)提取到一组ORC表中。

这种中间表示形式略微紧凑:例如,2020年12月的原始压缩数据大约占用60GB,但我为那个月的数据构建的ORC表只占用大约21GB。这意味着使用S3等服务存储10年数据的ORC表示形式,每月只需花费约40美元,更重要的是,这意味着处理或查询数据要便宜得多,也容易得多。

AWS的Athena允许您直接在S3中存储的ORC文件上运行SQL查询,例如。您还可以使用Athena处理S3中的CSV文件,但运行针对整个Twitter流抓取的压缩CSV文件的任何SQL查询至少需要2.50美元(因为所有2至3TB的压缩数据都需要扫描),而Athena中查询ORC的成本通常只有那一点的 tiny fraction,因为ORC格式使得避免扫描与查询不相关的数据成为可能。

像Athena这样的产品对于探索Twitter流抓取等数据非常有用,ORC在成本和时间上使其变得可行,但也可以直接处理ORC文件,例如,您不需要花费数百小时的计算时间从原始JSON数据中构建Twitter用户信息的数据库,而是只需花费几个小时从ORC文件中提取数据。

为什么是这个项目?

ORC格式是为了成为Apache Hive的本地存储格式而开发的,Hive建立在Hadoop之上,而Hadoop则坚定地处于Java生态系统中。我个人觉得Hive极其烦人且难以工作,我不喜欢写Java。

还有一个ORC的C++ API,但我已经用Rust编写了大量相关工具,并且我想了解更多关于ORC规范的内部细节,所以我决定尝试构建这个实现,这仅花了几天时间。

使用

该项目目前提供一个命令行工具,可以进行几件事情

$ target/release/orcrs --help
orcrs 0.1.0
Travis Brown <[email protected]>

USAGE:
    orcrs [OPTIONS] <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -v, --verbose    Level of verbosity
    -V, --version    Print version information

SUBCOMMANDS:
    export    Export the contents of the ORC file
    help      Print this message or the help of the given subcommand(s)
    info      Dump raw info about the ORC file

例如,列出从提供的数据样本中验证的Twitter账户的所有资料

target/release/orcrs -vvv export --header --columns 0,3,9 examples/ts-10k-2020-09-20.orc | egrep -v "(false|,)$"
id,screen_name,verified
561595762,morinaga_pino,true
1746230882607849472,weareoneEXO,true
29363584,Sandi,true
2067989391190130694,WayV_official,true
36764368,AdamParkhomenko,true
53970806,stephengrovesjr,true
15327404,fox32news,true
1678598579585548288,Mippcivzla,true
158278844,fadlizon,true
79721594,alfredodelmazo,true

该工具目前可以从代表2020年一天(886MB的ORC文件)的数据中导出约1000万行数据,大约需要6秒钟

$ time target/release/orcrs -vvv export --header --columns 0,3,9 /data/tsg/users/v2/2020-09-20.orc | wc
9705227 9705227 314287998

real    0m5.088s
user    0m6.048s
sys     0m0.349s

目前这完全未优化,可以至少稍微快一点。

特性

该项目目前仅支持读取 ORC文件(除非我某天切换到使用ORC C++ API的绑定,否则写入可能不会在范围内)。

特性 状态 注意
整型类型 ✔️
字符串类型 ✔️
浮点类型 即将推出
日期类型
复合类型
Zlib压缩 ✔️
Zstandard压缩 ✔️
Snappy压缩 可能非常简单
列加密 几乎肯定永久不在此范围内

此外,请注意,目前这些工具不使用索引:您可以看到文件中的每一行。到目前为止,这对我来说足够快,但将来可能会改变。

已知问题

该软件基本上未经测试、未记录和未优化。

开发中

您需要安装Rust和Cargo来构建项目。安装完成后,您可以检出此存储库并运行cargo test(运行测试)以及cargo build(构建命令行工具,它将在target/release/orcrs下可用)。

ORC文件中元数据的Protobuf模式不随此存储库分发,但将在构建过程中下载到$OUT_DIR/proto/。您可以根据需要手动或通过更改build.rs中的提交来更新此文件。在我尝试使Protobuf代码生成与构建正确工作15分钟后,我感到沮丧,所以它已经消失了。您需要将scripts/build.rs文件复制到项目目录中,以便更新Protobuf模式(但这不应该经常需要)。

此存储库还包括一个Java项目,其中包含我用于开发期间生成ORC测试数据的部分代码。

先前工作

这里有一个Rust ORC读取器的部分实现在此。我借用了一些字节运行长度编码读取器的测试用例,但我的实现与其他方面无关。

未来工作

我可能会继续根据需要添加对ORC格式特性的支持。最终,有一个C++ API的Rust绑定会很棒,我可能在这里完成这项工作。

许可证

本软件根据反资本主义软件许可协议(第1.4版)发布。

依赖关系

~9–20MB
~261K SLoC