将多个文件序列化为二进制Avro格式

时间:2015-06-29 16:34:03

标签: serialization text-processing avro

我目前有一个占用大量空间的文件目录。我想将每个文件压缩并序列化为二进制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等)来形成文件的JSON({'content':'file content ..'})。此外,还有更好的方法来实现更大的任务,即将多个文件迁移到Avro存储,而不是我正在开发的方法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我担心你不能以这种方式使用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字符串的文件,则必须在架构中描述该Json字符串中的所有字段。

答案 1 :(得分:0)

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

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

虽然我同情不想启动真正的编程语言,但Java Avro API(例如)可以更轻松地创建记录,并且更容易从系统上的文件中获取字节。

希望这有帮助,

儒略