我目前有一个占用大量空间的文件目录。我想将每个文件压缩并序列化为二进制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存储,而不是我正在开发的方法吗?
感谢。
答案 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(例如)可以更轻松地创建记录,并且更容易从系统上的文件中获取字节。
希望这有帮助,
儒略