我有一个非常大的镶木地板文件,我需要更改其中一个列的值。一种方法是更新源文本文件中的这些值并重新创建镶木地板文件,但我想知道是否有更便宜,更简单的解决方案。
答案 0 :(得分:3)
让我们从基础开始:
Parquet是一种需要保存在文件系统中的文件格式。
关键问题:
append
操作吗?append
文件? append
操作吗?数目:
parquet.hadoop.ParquetFileWriter
仅支持CREATE
和OVERWRITE
;没有append
模式。 (不确定,但这可能会在其他实现中发生变化 - 镶木地板设计确实支持append
)
HDFS允许append
使用dfs.support.append
属性的文件
Spark框架不支持append
现有的镶木地板文件,并且没有计划; see this JIRA
在分布式系统中附加到现有文件并不是一个好主意,特别是考虑到我们可能同时有两个编写器。
更多细节在这里:
答案 1 :(得分:1)
有解决方法,但是您需要以某种方式创建镶木地板文件,以使其更易于更新。
最佳做法:
A。使用行组创建镶木地板文件。您需要优化在行压缩中可以插入多少行数据,然后才能启用数据压缩和字典编码等功能。
B。一次扫描一个行组,并找出需要更新的行组。为每个修改的行组生成具有修改后的数据的新镶木地板文件。一次处理一个行组的数据而不是文件中的所有数据,这样可以提高内存效率。
C。通过附加未修改的行组以及通过读取每个行组的一个镶木文件生成的修改后的行组来重建原始镶木文件。
使用行组重新组合拼花文件非常快。
理论上,如果只删除页脚(统计信息),附加新的行组并添加具有更新统计信息的新页脚,则应该容易地将其附加到现有的镶木文件中,但是没有支持它的API /库..
答案 2 :(得分:0)
您必须重新创建文件,这是Hadoop的方式。特别是如果压缩文件。
另一种方法(在Big-data中很常见)是在另一个Parquet(或ORC)文件上进行更新,然后在查询时进行JOIN / UNION更新。
答案 3 :(得分:0)
看看这个不错的博客,它可以回答您的问题,并提供一种使用Spark(Scala)执行更新的方法:
http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html
从博客复制并粘贴:
当我们需要在数据结构(Parquet)中编辑不可变的数据时。
您可以将分区添加到Parquet文件中,但是不能就地编辑数据。
但是最终我们可以对数据进行突变,我们只需要接受我们不会就地进行数据处理。我们将需要使用模式和UDF的组合来重新创建Parquet文件,以更正不良数据。
如果您想在Parquet中增量添加数据(您没有问这个问题,对其他读者还是有用的) 请参阅这个写得很好的博客:
http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html
免责声明:我没有写那些博客,我只是读了一下,发现它可能对其他人有用。