Como selecionar a primeira linha de cada grupo?

Eu tenho um DataFrame gerado da seguinte maneira:

df.groupBy($"Hour", $"Category")
  .agg(sum($"value") as "TotalValue")
  .sort($"Hour".asc, $"TotalValue".desc))

Os resultados são parecidos com:

+----+--------+----------+
|Hour|Category|TotalValue|
+----+--------+----------+
|   0|   cat26|      30.9|
|   0|   cat13|      22.1|
|   0|   cat95|      19.6|
|   0|  cat105|       1.3|
|   1|   cat67|      28.5|
|   1|    cat4|      26.8|
|   1|   cat13|      12.6|
|   1|   cat23|       5.3|
|   2|   cat56|      39.6|
|   2|   cat40|      29.7|
|   2|  cat187|      27.9|
|   2|   cat68|       9.8|
|   3|    cat8|      35.6|
| ...|    ....|      ....|
+----+--------+----------+

Como você pode ver, o DataFrame é ordenado porHour em uma ordem crescente, então porTotalValue em ordem decrescente.

Gostaria de selecionar a linha superior de cada grupo, ou seja,

do grupo de horas == 0, selecione (0, cat26,30,9)do grupo de horas == 1, selecione (1, cat67,28,5)do grupo de horas == 2, selecione (2, cat56,39,6)e assim por diante

Portanto, a saída desejada seria:

+----+--------+----------+
|Hour|Category|TotalValue|
+----+--------+----------+
|   0|   cat26|      30.9|
|   1|   cat67|      28.5|
|   2|   cat56|      39.6|
|   3|    cat8|      35.6|
| ...|     ...|       ...|
+----+--------+----------+

Pode ser útil também selecionar as N linhas principais de cada grupo.

Qualquer ajuda é muito apreciada.

questionAnswers(8)

yourAnswerToTheQuestion