pandas - Delta Lake:性能挑战
问题描述
方法 1:我的输入数据是一堆 json 文件。预处理后,输出为 pandas 数据帧格式,将写入 Azure SQL 数据库表。
方法 2:我已经实现了 delta Lake,其中输出 pandas 数据帧被转换为 Spark 数据帧,然后将数据插入到 Partitioned Delta Table。该过程很简单,将 pandas 数据帧转换为 spark 数据帧所需的时间也以毫秒为单位。但是与方法 1 相比,性能很差。使用方法 1,我能够在不到方法 2 所需时间的一半内完成。
我尝试了不同的优化技术,如 ZORDER、Compaction(bin-packing),使用 insertInto 而不是 saveAsTable。但没有一个能真正提高性能。
如果我错过了任何性能调整方法,请告诉我。如果没有,我很想知道为什么 Delta Lake 的性能不如 pandas+database 方法。而且,我很高兴知道任何其他更好的方法。例如,我遇到了 dask。
非常感谢您提前回答。
问候,柴坦亚
解决方案
您没有提供足够的信息来回答您的问题。数据摄取的整个过程究竟是什么表现不佳?
如果您将数据处理到三角洲湖中,Z-ordering 不会给您带来优势,它更有可能减慢您的速度。当您之后读取数据时,它会给您带来优势。通过例如 ID 进行 Z 排序,尝试将具有相同 ID 的列保存在同一文件中,这将使 spark 能够使用数据跳过来避免读取不必要的数据。
另外,您的数据实际上有多大?如果我们在最后谈论几 GB 的数据,那么 pandas 和传统数据库的执行速度会更快。
我可以给你举个例子:
假设您有一个每天处理 4 GB 数据的批处理作业。如果它只是处理 4 GB 以将其存储在某个地方,spark 将不会像我已经提到的那样更快地执行。
但现在考虑一下你的工作运行了一年,在年底为你提供了大约 1.5 TB 的数据。现在您可以对整个数据历史记录执行分析,在这种情况下,您可能会比数据库和 pandas 快得多。
作为旁注,您说您正在阅读一堆 json 文件以将它们转换为 pandas 而不是 delta Lake。如果在方法 2 中没有特定的理由这样做,我会使用:
spark.read.json("path")
为了避免将其从 pandas 转换为 spark 数据帧的过程。
推荐阅读
- android - Android相机:如何使用openCV处理onPictureTaken中的字节数据
- mysql - MySQL INSERT INTO 语句给出错误代码 1062
- android - 将 Firebase 连接到 Android 工作室
- javascript - React JS:重构 Redux 选择器
- c# - 为什么我会收到 System.OverflowException?
- excel - VBA查找工作簿保存的文件夹
- r - 根据列中的值运行预测模型
- android - NestedScrollView 内的 ConstraintLayout(带有 RecyclerView )
- php - 移动范围滑块后按下提交按钮时,新电影将刷新(Laravel)
- node.js - Google Action Webhook 实施