更新 apache parquet 文件中的值

Updating values in apache parquet file

我有一个相当大的镶木地板文件,我需要在其中更改其中一列的值。一种方法是更新源文本文件中的这些值并重新创建镶木地板文件,但我想知道是否有更便宜且总体上更简单的解决方案。

让我们从基础开始:

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

关键问题:

  1. parquet 是否支持 append 操作?
  2. 文件系统(即HDFS)是否允许对文件进行append
  3. 作业框架 (Spark) 可以实现 append 操作吗?

答案:

  1. parquet.hadoop.ParquetFileWriter只支持CREATEOVERWRITE;没有 append 模式。 (不确定,但这可能会在其他实现中发生变化——镶木地板设计确实支持 append

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

  3. Spark 框架不支持 append 现有的 parquet 文件,并且没有计划; see this JIRA

It is not a good idea to append to an existing file in distributed systems, especially given we might have two writers at the same time.

更多详情在这里:

必须重新创建文件,这是Hadoop方式。特别是如果文件被压缩。

另一种方法(在大数据中很常见)是对另一个 Parquet(或 ORC)文件进行更新,然后在查询时加入/联合。

查看这个不错的博客,它可以回答您的问题并提供使用 Spark(Scala) 执行更新的方法:

http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html

从博客复制粘贴:

当我们需要在不可变的数据结构 (Parquet) 中编辑数据时。

You can add partitions to Parquet files, but you can’t edit the data in place.

But ultimately we can mutate the data, we just need to accept that we won’t be doing it in place. We will need to recreate the Parquet files using a combination of schemas and UDFs to correct the bad data.

如果你想在Parquet中增量追加数据(你没有问这个问题,对其他读者来说还是有用的) 参考这个写得很好的博客:

http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html

免责声明:我没有写过那些博客,我只是阅读它,发现它可能对其他人有用。

有解决方法,但您需要以特定方式创建您的 parquet 文件以使其更易于更新。

最佳实践:

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

乙。一次扫描一个行组,找出哪些行组需要更新。为每个修改后的行组生成包含修改后数据的新镶木地板文件。一次处理一个行组的数据价值比文件中的所有数据更有效。

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

使用行组重新组合 parquet 文件的速度出奇地快。

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