如何将数据追加到现有的Parquet文件中

28

我正在使用以下代码创建ParquetWriter并向其中写入记录。

ParquetWriter<GenericRecord> parquetWriter = new ParquetWriter(path, writeSupport, CompressionCodecName.SNAPPY, BLOCK_SIZE, PAGE_SIZE);

final GenericRecord record = new GenericData.Record(avroSchema);

parquetWriter.write(record);

但它只允许在指定路径创建新文件。 有没有一种方法可以将数据追加到现有的parquet文件(在路径上)? 在我的情况下,缓存parquetWriter不可行。

但它只能在指定路径创建新文件。 是否有一种方法可以将数据追加到现有的Parquet文件(在路径上)?在我的情况下,缓存ParquetWriter不可行。

你找到了将数据追加到Parquet文件的解决方案吗? - sahara108
3个回答

21

6
既然 Parquet 客户端 API 不支持追加,那么 Spark 该怎么做呢? - Devas
32
这段代码将数据写入到 Parquet 文件夹中,添加一个新文件不会影响已经存在的文件。 - agonen
6
@agonen说它会创建一个新文件。 有人知道是否有一种方法可以将数据附加到现有文件中吗? - Jules
是否可以将内容附加到 S3 对象? - Eduardo EPF

8

将数据附加到现有的Parquet文件有些棘手。至少没有简单的方法可以做到这一点(大多数已知的库都不支持此操作)。

Parquet设计确实支持附加功能。一种附加数据的方法是编写一个新的行组,然后重新计算统计信息并更新统计信息。尽管对于小的更新来说会很糟糕(导致压缩不佳和过多的小行组)。

然而,大多数库都没有实现这一点。以下是我找到的一个有关此问题的有趣讨论

我正在关闭“不修复”。试图修改现有文件(覆盖现有文件页脚)是一个非常棘手的问题,需要在部分编写的文件中初始化各种类的代码库,并且会增加一些复杂性。

这里还有一个Spark的功能请求,但它也不会被实现。

我将其标记为无效。在分布式系统中附加到现有文件不是一个好主意,特别是考虑到我们可能同时拥有两个编写者。

在这个线程上的其他答案 - 这只是在相同目录下创建新文件。然而,从我所看到的情况来看,这可能是大多数人唯一可行的选择。 我们还有哪些其他选择?
  • 每次需要更新/追加数据时删除并重新创建整个parquet文件。最好预先批处理数据以减少文件重建的频率。
  • 编写多个parquet文件。然后在以后的阶段将它们合并。
  • 编写多个parquet文件。您用于读取parquet文件的工具可能支持将目录中的多个文件作为单个文件读取。许多大数据工具都支持此功能。请注意不要编写太多小文件,否则读取性能会很差。
  • 切换到支持追加/更新/删除的开放式表格式,例如Iceberg/Delta。但是,也要注意不要在这里进行过多的小型更新/追加/删除。

编辑:我发现了一个基于python的库(fastparquet),可以进行追加。未来其他语言的库(如Java)也可能实现相同的功能。


-7

Parquet是一种列式文件,它优化了所有列的写入。如果需要进行任何编辑,则需要重写文件。

来自维基百科

列式数据库将一列中的所有值串行存储在一起,然后是下一列的值,以此类推。对于我们的示例表,数据将以这种方式存储:

10:001,12:002,11:003,22:004;
Smith:001,Jones:002,Johnson:003,Jones:004;
Joe:001,Mary:002,Cathy:003,Bob:004;
40000:001,50000:002,44000:003,55000:004;

一些链接

https://en.wikipedia.org/wiki/Column-oriented_DBMS

https://parquet.apache.org/


11
以上答案不准确。Parquet 将列切片为块,并允许将列的部分存储在单个文件中的多个块中,因此可以进行追加。如果您阅读 Parquet 的设计哲学,可以清楚地看出该格式是为追加而设计的,这可以从块页脚结构得出判断。 - travnik
我认为parquet客户端API不支持append操作,我知道在spark中有这个功能,但我对支持仅读取所需块的列存储存储方式存在疑问。在这种情况下,append如何工作?可能会有在现有列块中进行追加的机会。您是否有一个包含架构细节的链接? - Devas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接