更新apache镶木地板文件中的值

mar*_*oss 14 apache-spark parquet

我有一个非常沉重的拼花文件,我需要更改其中一个列的值.一种方法是更新源文本文件中的这些值并重新创建镶木地板文件,但我想知道是否有更便宜,更简单的解决方案.

小智 7

有一些解决方法,但您需要以某种方式创建镶木地板文件以使其更易于更新。

最佳实践:

A. 使用行组创建镶木地板文件。在数据压缩和字典编码等功能停止发挥作用之前,您需要优化可以进入行组的数据行数。

B. 一次扫描一个行组,找出哪些行组需要更新。为每个修改的行组生成带有修改数据的新镶木地板文件。一次处理一个行组的数据,而不是文件中的所有数据,内存效率更高。

C. 通过附加未修改的行组和通过读取每个行组的一个 Parquet 文件生成的修改的行组来重建原始 Parquet 文件。

使用行组重新组装镶木地板文件的速度非常快。

从理论上讲,如果您只是删除页脚(统计信息),附加新行组并添加带有更新统计信息的新页脚,那么应该很容易附加到现有的镶木地板文件中,但是没有支持它的 API/库。


Kra*_*tam 6

让我们从基础开始:

Parquet是一种文件格式,需要保存在文件系统中。

关键问题:

  1. 实木复合地板是否支持append作业?
  2. 文件系统(即HDFS)是否允许append文件?
  3. 作业框架(火花)可以实施append操作吗?

答案:

  1. parquet.hadoop.ParquetFileWriter仅支持CREATEOVERWRITE; 没有append模式。(不确定,但是在其他实现中这可能会改变-实木复合地板设计确实支持append

  2. HDFS允许append使用该dfs.support.append属性处理文件

  3. Spark框架不支持append现有的镶木地板文件,并且没有计划;看到这个JIRA

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

更多详细信息在这里: