gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:47:15 25 4
gpt4 key购买 nike

我的问题是这样的。我有一个 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 的开头,您会发现:

  • 一个 long 指示此 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com