java - 如何获取压缩avro文件中每个avro记录的开始和结束?

标签 java avro

我的问题是这样的。我有一个 2GB 的压缩 avro 文件,其中存储在 HDFS 上大约 1000 个 avro 记录。我知道我可以编写代码来“打开这个 avro 文件”并打印出每个 avro 记录。我的问题是,java中有没有一种方法可以打开这个avro文件,迭代每个记录并将该avro文件中每个记录的“开始位置”和“结束位置”输出到文本文件中,这样.. .我可以有一个java函数调用“readRecord(startposition, endposition)”,它可以利用startposition和endposition来快速读出一个特定的avro记录,而不必迭代整个文件?

最佳答案

我没有时间为您提供现成的实现,但我想我可以为您提供一些提示。

让我们从 Avro 规范开始:Object Container Files

基本上,Avro 文件是一组包含一个或多个记录的独立 block (您可以配置 block 大小,并且记录永远不会拆分为两个 block )。在每个 block 的开头,您会发现:

  • 一个长整型值,指示此 block 中的对象数量。
  • 长整型,表示应用任何编解码器后当前 block 中序列化对象的大小(以字节为单位)
  • 序列化的对象。如果指定了编解码器,则由该编解码器压缩。
  • 文件的 16 字节同步标记。

文档明确指出“因此,可以有效地提取或跳过每个 block 的二进制数据,而无需反序列化内容。 block 大小、对象计数和同步标记的组合可以检测损坏的 block 并帮助确保数据完整性.”。

您不能直接查找特定记录,但可以查找给定 block 然后迭代其对象。它不完全是您所需要的,但看起来足够接近。我相信您不会比使用 Avro 容器做得更好。您仍然可以调整 block 大小以限制 block 内的最大迭代次数。使用压缩时,它会在 block 级别应用,因此不会成为问题。

我相信这样的阅读器可以仅使用公共(public) Avro API 来实现(FileDataReader 提供 seeksync 方法等)

关于java - 如何获取压缩avro文件中每个avro记录的开始和结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32528644/

相关文章:

java - 使用 saxon 获取远程 XML

java - XMLStreamReader 和解码 SOAP 消息

Hadoop - 如何从实现可写接口(interface)切换到使用 Avro 对象?

avro - 如何将 avsc 文件转换为 avdl 文件?

java - 如何处理参数与返回值紧密相连的方法。如果参数为空怎么办? java

java - Java中如何处理自引用和继承

java - 上传文件时未找到 public javax.ws.rs.core.Response 类型参数的注入(inject)源

scala - 使用Spark 2.0.2从Kafka读取Avro消息(结构化流)

hadoop - 在hadoop中选择文件格式

hadoop - Hive巨大的数据大小从将Avro转换为Parquet