Улучшена производительность при использовании Window.partitionBy вместо groupBy - PullRequest
2 голосов
/ 13 июня 2019

У меня есть один фрейм данных scala-spark с тремя столбцами, скажем, Col1, Col2 и Col3.Этот фрейм данных имеет около 54 миллионов строк.

Мне нужно максимум Col3 на Col1, комбинацию Col2, как показано ниже

[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

Затем я попробовал то же самое, используя оконную функцию

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

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

Каким-то образом приведенный выше код успешно выполнен.Я пытаюсь выяснить причину этого, поскольку теоретически обе операции похожи и имеют одинаковый план выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...