使用Window.partitionBy而不是groupBy时提高了性能

时间:2019-06-13 07:09:31

标签: apache-spark apache-spark-sql window-functions

我有一个scala-spark数据帧,其中有三列,分别是Col1,Col2和Col3。该数据框大约有5400万行。

我想要的是每个Col1,Col2组合的最大Col3,如下所示:

[DataSet]

val maxDf = df.groupBy(Col1, Col2).agg(F.max(Col3))

[Expected Result]

但是当我尝试使用groupBy来达到上述目的时,它以以下错误失败了

java.lang.OutOfMemoryError: Unable to acquire 8168736160 bytes of memory, got 0

然后我使用Window函数尝试了

val window  = Window.partitionBy("Col1","Col2")

val maxDf = df.withColumn("maxVal", F.max("Col3").over(window))

以上代码已成功执行。我试图找出背后的原因,因为从理论上讲,这两个操作都是相似的,并且具有相同的执行计划。

0 个答案:

没有答案