Delta Lake:性能挑战

问题描述

方法1:我的输入数据是一堆json文件。经过预处理后,输出将以pandas数据帧格式输出,并将其写入Azure sql数据库表。

方法2:我已经实现了三角洲湖,在该湖中将输出熊猫数据帧转换为Spark数据帧,然后将数据插入到分区三角洲表中。该过程很简单,将熊猫数据框转换为火花数据框所需的时间也以毫秒为单位。但是,与方法1相比,性能较差。使用Approach1,我可以不到方法2所需时间的一半即可完成。

我尝试了不同的优化技术,例如ZORDER,压缩(箱包装),使用insertInto而不是saveAsTable。但是,并没有真正提高性能

请让我知道是否错过了任何性能调整方法。如果没有,我很想知道为什么Delta Lake的性能没有比pandas + database方法更好。而且,我很高兴知道其他更好的方法。例如,我碰巧遇到了。

非常感谢您提前答复。

关于, 柴坦亚

解决方法

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

如果将数据处理到三角洲湖中,Z排序不会给您带来任何优势,它甚至可能会使您的速度变慢。当您以后读取数据时,它将为您提供一个优势。按ID进行Z排序(例如,ID)会尝试将具有相同ID的列保存在同一文件中,这将使spark能够使用数据跳过功能来避免读取不必要的数据。

您的数据实际还有多大?如果我们在熊猫末尾谈论几GB的数据,那么传统的数据库将更快地运行。

我可以举一个例子:

让我们说您有一个每日批处理作业,处理4 GB的数据。正如我已经提到的,如果仅处理4 GB的数据以将其存储在某个地方,火花的执行速度将不一定会更快。

但是现在考虑到您已经完成了该工作一年,到年底将为您提供约1.5 TB的数据。现在,您可以对整个数据历史进行分析,在这种情况下,您可能比数据库和熊猫快得多。

作为旁注,您说您正在读一堆json文件,将它们转换为熊猫,而不是三角洲湖。 如果在方法2中没有特定原因,我将使用:

spark.read.json("path")

为避免将其从熊猫转换为Spark数据帧的过程。