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 编程语言处理 Apache ORC 文件的工具。
ORC 是一种开源数据格式,可以高效地表示数据表(类似于 CSV,但包含类型、压缩、索引等)。
请注意,此软件不是“开源”的,但源代码可供个人、非营利组织以及员工拥有的企业使用和修改(有关详细信息,请参阅下面的许可部分)。
示例用法
我最近一直在使用由 Twitter Stream Grab 发布的数据集,这是 Archive Team 和 Internet 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模式不随此存储库分发,但将在构建过程中下载到在我尝试使Protobuf代码生成与构建正确工作15分钟后,我感到沮丧,所以它已经消失了。您需要将$OUT_DIR/proto/
。您可以根据需要手动或通过更改build.rs
中的提交来更新此文件。scripts/build.rs
文件复制到项目目录中,以便更新Protobuf模式(但这不应该经常需要)。
此存储库还包括一个Java项目,其中包含我用于开发期间生成ORC测试数据的部分代码。
先前工作
这里有一个Rust ORC读取器的部分实现在此。我借用了一些字节运行长度编码读取器的测试用例,但我的实现与其他方面无关。
未来工作
我可能会继续根据需要添加对ORC格式特性的支持。最终,有一个C++ API的Rust绑定会很棒,我可能在这里完成这项工作。
许可证
本软件根据反资本主义软件许可协议(第1.4版)发布。
依赖关系
~9–20MB
~261K SLoC