如何有效地将新的avro记录添加到现有的avro文件中。我的avro文件将继续增加,我不想将文件打开到内存中。请您告诉我们如何有效地实现这一目标。
答案 0 :(得分:0)
您可以使用DataFileWriter.appendTo
。这不会将现有文件的内容加载到内存中。 (在引擎盖下,它将读取文件的开头以查找架构和其他元数据,然后追加到最后而不加载其间的内容。)
如果您想在HDFS上执行此操作,this gist也可能是一个很好的起点。
答案 1 :(得分:0)
你的问题和相关技术含糊不清;但我会尽力回答我的理解。 我将假设你在HDFS中这样做。
data in dir vs files
:
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();