apache-spark - 如何使用 Spark Streaming 更新 parquet 文件?
问题描述
我正在使用火花流来制作实时数据管道。我从 Kafka 获取实时数据并使用 Spark 处理这些数据。
但是,当我使用来自 S3 的新传入数据更新 S3 上现有的镶木地板文件时,它的性能并不好。因为我必须从 S3 获取现有的分区 parquet 文件并用来自 Kafka 的新记录替换旧记录,然后覆盖 S3 上的完整分区 parquet 文件。
所以这需要很多时间,因为该表经常更新。
你能建议我在火花流中执行更新操作的更好方法吗?
提前致谢。
解决方案
当我们说“parquet 文件”时,我们真正的意思是一个包含多个文件的目录结构。这些文件的组织方式以及它们所代表的内容取决于分区选项以及其他方面。
要理解的重要一点是,信息更新的单位是一个文件(来自上面描述的这个目录结构)。所以,如果你在这个目录结构中有一个 10Gb 的文件,并且你想从一个只有 4 个字节长的记录中更新一个字段......我很抱歉......但是你必须覆盖整个10Gb 文件。
Parquet 的设计初衷不是用作数据库,而是像类固醇上的 CSV,如果您允许我使用这种比喻的话。
为了更新存储为 parquet 的内容,您首先需要了解您的数据,了解您的工作流程,以方便的方式对数据进行分区,然后使用某些技术。
我选择了一篇文章,它更详细地解释了这个问题,并解释了如何规避这个困难。简而言之,您将使用一个叫做 Delta Lake 的东西,它基本上是一个基于类固醇的 parquet 目录结构,它提供了许多好处。
推荐阅读
- javascript - Onclick 值显示在另一个输出中
- javascript - 在 Vue.js 中更新数据
- android-studio - 如何在 Android Studio 布局设计器中对自定义属性进行分组?
- java - PopupMenu 不弹出 onclick
- c# - 在 WebResourceRequested 事件中为 WebView2 设置 cookie
- google-chrome - WebGLRenderer 错误:在 chrome 版本 83.0.4103.106 中创建 WebGL 上下文时出错
- c++ - 与顶级窗口的事件一起使用时,strftime 打印相同的日期格式而不是新日期
- bitmap - Zebra 打印机 (P430i):如何使用 EPCL 打印位图
- html - 我可以在带有输入的标签内选择 ::after 吗?
- python - 预处理文本以输入在 imdb 数据集上训练的模型