首页 > 解决方案 > 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。

非常感谢您提前回答。

问候,柴坦亚

标签: pandasdelta-lake

解决方案


您没有提供足够的信息来回答您的问题。数据摄取的整个过程究竟是什么表现不佳?

如果您将数据处理到三角洲湖中,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 数据帧的过程。


推荐阅读