#hadoop #decoding #native #sequence #handles #reading #reader

sequencefile

用于处理 Hadoop SequenceFile 的原生 Rust 库。目前只支持读取。

6 个版本

使用旧的 Rust 2015

0.2.0 2021年11月23日
0.1.4 2016年2月11日
0.1.1 2016年1月31日

#7 in #handles

MIT/Apache

26KB
540

Build Status Coverage Status

rust-sequencefile

Rust 的 Hadoop SequenceFile 库

文档

# Cargo.toml
[dependencies]
sequencefile = "0.2.0"

状态

原型状态!我正在学习 Rust。 :) 欢迎反馈。

不幸的是,这意味着 API 将会更改。如果您依赖此软件包,请现在完全限定您的版本。

目前支持读取各种类型的序列文件。处理未压缩的序列文件以及块/记录压缩文件(deflate、gzip 和 bzip2)。LZO 和 Snappy 目前不支持。

还有很多工作要做

  • Varint 解码
  • 块大小使用 Varint 编写
  • 块解压缩
  • 支持 Gzip
  • 支持 Bzip2
  • Sequencefile 元数据
  • 更好的错误处理
  • 测试
  • 更好的错误处理2
  • 更多的测试
  • 更好的文档
  • 支持 Snappy
  • 支持 CRC 文件
  • '可序列化',例如通用反序列化常见 Hadoop 可序列化类型
  • 写入器
  • 优雅地处理第 4 版序列文件
  • 零拷贝实现。
  • 支持 LZO

基准测试

目前还没有正式的基准测试。然而,在我的早期 2012 年 MBP 上,98.4% 的 CPU 时间用于 miniz,产生了 ~125MB/s 的解压缩数据。

用法

let path = Path::new("/path/to/seqfile");
let file = File::open(&path).unwrap();

let seqfile = sequencefile::Reader::new(file).expect("Failed to open sequence file.");

for kv in seqfile {
    println!("{:?}", kv); // Some(([123, 123], [456, 456]))
}

// Until there's automatic deserialization, you can do something like this:
// VERY hacky
let kvs = seqfile.map(|e| e.unwrap()).map(|(key, value)| {
    (BigEndian::read_i64(&key),
     String::from_utf8_lossy(&value[2..value.len()]).to_string())
});

for (k,v) in kvs {
  println!("key: {}, value: {}", k, v);
}

许可

rust-sequencefile 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发,部分受各种 BSD-like 许可证的约束。

有关详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT。

依赖项

~1.5MB
~24K SLoC