如何有效地将新的avro记录添加到现有avro文件中。我的avro文件将继续增长的大小,我不想打开文件到memory.Could你请告诉我们,我们可以如何有效地实现这一点。
发布于 2015-11-24 15:01:45
您可以使用DataFileWriter.appendTo。这不会在内存中加载现有文件的内容。(在幕后,它将读取文件的开头以查找模式和其他元数据,然后附加到末尾,而不加载中间的内容。)
如果你想在HDFS上做到这一点,this gist可能也是一个很好的起点。
发布于 2018-05-19 22:54:18
你的问题和相关技术是模棱两可的,但我会尽我所能回答。我将假设您是在HDFS中执行此操作。
data in dir vs files
在HDFS中,您可以考虑目录而不是文件。Hadoop生态系统中的工具,例如hive或spark,允许您从目录中读取“数据”,而无需考虑目录中存储的文件数量。这样,您将文件添加到目录中,您的“查询”将逐步显示或获取越来越多的数据。
AVRO , record based
我会把AVRO文件看作是avro记录。假设您有一个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(); https://stackoverflow.com/questions/33865109
复制相似问题