【问题标题】:Serializing multiple files to binary Avro format将多个文件序列化为二进制 Avro 格式
【发布时间】:2015-06-29 16:34:03
【问题描述】:

我目前有一个占用大量空间的文件目录。我想将这些文件中的每一个压缩并序列化为二进制 Avro 格式以释放磁盘空间。 Avro 数据文件的架构将只是一个包含单个字段的记录,用于存储原始文件的内容。我正在考虑使用 Apache 提供的 avro-tools jar 中的实用程序来序列化每个文件。该实用程序采用 Avro 模式和包含要以 JSON 格式序列化的记录的输入文件,并生成 Avro 数据文件:

$ java -jar ~/avro-tools-1.7.6.jar fromjson --schema-file twitter.avsc twitter.json > twitter.avro

我想编写一个 bash 脚本,为文件夹中的每个文件执行此工具,但我不确定如何以工具期望的 JSON 格式为每个文件形成等效记录。每个文件的大小为数百 MB。我想知道是否可以使用命令行中的文本处理命令或工具(awk、sed 等)来为文件({'content':'file content..'})形成 JSON。此外,有没有比我正在研究的方法更好的方法来完成更大的任务,将多个文件迁移到 Avro 存储?

谢谢。

【问题讨论】:

  • 可能听起来像一个愚蠢或愚蠢的评论,但我还是想说,因为我不清楚你的目标是什么。如果您的目标是释放磁盘空间,为什么不使用 TAR/ZIP 来压缩文件。

标签: serialization text-processing avro


【解决方案1】:

目前看起来不错。你需要一个架构,比如

{
  'type': 'record',
  'fields':[{'name': 'content', 'type': bytes}]
}

虽然我对不使用真正的编程语言的愿望表示同情,但 Java Avro API(例如)使创建记录变得更容易,并且更容易从系统上的文件中获取字节。

希望这会有所帮助,

朱利安

【讨论】:

    【解决方案2】:

    恐怕您不能以这种方式使用 Apache avro。当您制作 avro 模式时,您需要使用原始类型(null、boolean、int、long、float、double、bytes、string)确定每个复杂类型(记录、枚举、数组、映射、联合和固定),但不能以任何方式描述整个文件。

    您可以阅读this 了解这个库是什么。

    如果你会使用这样的架构

    {
      'type': 'record',
      'fields':[{'name': 'content', 'type': bytes}]
    }
    

    要序列化一个文件(即使该文件包含 Json 字符串),你会得到 AvroTypeException,因为 avro-tools 会期望名为“content”的字段类型为“bytes”,而使用的文件中没有这样的字段。

    如果要序列化包含 Json-string 的文件,则必须在 schema 中描述该 Json-string 中的所有字段。

    【讨论】:

    • 看起来可能进行了编辑以表明 bytes 类型适用于他们的情况?
    猜你喜欢
    • 2011-04-15
    • 2014-10-16
    • 1970-01-01
    • 2011-03-16
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多