首页 > 解决方案 > 如何使用 Spark Streaming 更新 parquet 文件?

问题描述

我正在使用火花流来制作实时数据管道。我从 Kafka 获取实时数据并使用 Spark 处理这些数据。

但是,当我使用来自 S3 的新传入数据更新 S3 上现有的镶木地板文件时,它的性能并不好。因为我必须从 S3 获取现有的分区 parquet 文件并用来自 Kafka 的新记录替换旧记录,然后覆盖 S3 上的完整分区 parquet 文件。

所以这需要很多时间,因为该表经常更新。

你能建议我在火花流中执行更新操作的更好方法吗?

提前致谢。

标签: apache-sparkspark-streamingparquet

解决方案


当我们说“parquet 文件”时,我们真正的意思是一个包含多个文件的目录结构。这些文件的组织方式以及它们所代表的内容取决于分区选项以及其他方面。

要理解的重要一点是,信息更新的单位是一个文件(来自上面描述的这个目录结构)。所以,如果你在这个目录结构中有一个 10Gb 的文件,并且你想从一个只有 4 个字节长的记录中更新一个字段......我很抱歉......但是你必须覆盖整个10Gb 文件。

Parquet 的设计初衷不是用作数据库,而是像类固醇上的 CSV,如果您允许我使用这种比喻的话。

为了更新存储为 parquet 的内容,您首先需要了解您的数据,了解您的工作流程,以方便的方式对数据进行分区,然后使用某些技术。

我选择了一篇文章,它更详细地解释了这个问题,并解释了如何规避这个困难。简而言之,您将使用一个叫做 Delta Lake 的东西,它基本上是一个基于类固醇的 parquet 目录结构,它提供了许多好处。

https://mungingdata.com/delta-lake/merge-update-upserts/

https://delta.io


推荐阅读