我有一个scala-spark数据帧,其中有三列,分别是Col1,Col2和Col3。该数据框大约有5400万行。
我想要的是每个Col1,Col2组合的最大Col3,如下所示:
[
val maxDf = df.groupBy(Col1, Col2).agg(F.max(Col3))
[
但是当我尝试使用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))
以上代码已成功执行。我试图找出背后的原因,因为从理论上讲,这两个操作都是相似的,并且具有相同的执行计划。