【发布时间】:2015-11-23 06:45:53
【问题描述】:
如何有效地将新的 avro 记录添加到现有的 avro 文件中。我的 avro 文件会不断增大,我不想将文件打开到内存中。您能告诉我们实现这一目标的效率吗?
【问题讨论】:
-
您尝试使用哪种语言进行此操作?爪哇?
标签: avro
如何有效地将新的 avro 记录添加到现有的 avro 文件中。我的 avro 文件会不断增大,我不想将文件打开到内存中。您能告诉我们实现这一目标的效率吗?
【问题讨论】:
标签: avro
您可以使用DataFileWriter.appendTo。这不会将现有文件的内容加载到内存中。 (在底层,它将读取文件的开头以查找架构和其他元数据,然后附加到末尾而不加载中间的内容。)
如果您想在 HDFS 上执行此操作,this gist 可能也是一个不错的起点。
【讨论】:
new File(somePath) 时,它不会将文件的内容加载到内存中,它主要只是执行一些路径解析逻辑。)
您的问题和相关技术不明确;但我会尽力回答我所理解的。 我会假设您在 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();
【讨论】: