有效地将avro记录写入avro文件

时间:2015-11-23 06:45:53

标签: avro

如何有效地将新的avro记录添加到现有的avro文件中。我的avro文件将继续增加,我不想将文件打开到内存中。请您告诉我们如何有效地实现这一目标。

2 个答案:

答案 0 :(得分:0)

您可以使用DataFileWriter.appendTo。这不会将现有文件的内容加载到内存中。 (在引擎盖下,它将读取文件的开头以查找架构和其他元数据,然后追加到最后而不加载其间的内容。)

如果您想在HDFS上执行此操作,this gist也可能是一个很好的起点。

答案 1 :(得分:0)

你的问题和相关技术含糊不清;但我会尽力回答我的理解。 我将假设你在HDFS中这样做。

data in dir vs files

在HDFS中,您可以根据目录而不是文件来思考。 Hadoop生态系统中的工具,例如蜂巢或火花让你阅读"数据"来自目录而不考虑存储在目录中的文件数。 通过这种方式,您可以将文件添加到目录中,并且可以查询"查询"将逐步显示或获取越来越多的数据。

AVRO , record based

我认为AVRO文件是avro记录。 LEt's说你有一个avro架构,你在内存/程序/代码中生成一个对象,然后将其转换为AVRO格式。此对象将转换为一个avro记录。如果您将该数据写入文件,那将是一个avro记录。在10天的过程中,如果你在同一个目录中写入10个文件,当你阅读"目录"时,你将拥有10个记录。

immutability

一般来说,我认为HDFS数据是不可变的。写入的任何文件主要是读取而不是修改。同样适用于AVRO记录,它只是一个包含模式和数据的文件。即你通常会从不读同一个文件并进行修改。我假设您将添加新数据而不是修改它。因此,您只需创建新记录。

serialize multiple objects to one file

现在让我们考虑一下你真的想写多个"对象到一个文件。 我将假设您在给定时间点实际上在手/代码中有这些多个对象,并希望持久保存到单个文件中。 如果您使用jackson-dataformat-avro,则会提供SequenceWriter来执行此操作。

SequenceWriter w = mapper.writer(schema).writeValues(mySingleAvroFile); 
w.write(firstObject); 
w.write(secondObject); 
...
w.close();