Comment sélectionner la première ligne de chaque groupe?

J'ai un DataFrame généré comme suit:

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

Les résultats ressemblent à:

+----+--------+----------+
|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|
| ...|    ....|      ....|
+----+--------+----------+

Comme vous pouvez le voir, le DataFrame est commandé par Hour dans un ordre croissant, puis par TotalValue dans un ordre décroissant.

Je voudrais sélectionner la ligne supérieure de chaque groupe, c'est à dire

  • du groupe de l'Heure==0 sélectionnez (0,cat26,de 30,9)
  • du groupe de l'Heure==1 sélectionnez (1,cat67,28.5)
  • du groupe de l'Heure==2 sélectionnez (2,cat56,de 39,6)
  • et ainsi de suite

De sorte que la sortie désirée serait:

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

Il pourrait être pratique de pouvoir sélectionner les N premières lignes de chaque groupe ainsi.

Toute aide est très appréciée.

OriginalL'auteur Rami | 2015-11-23