Я бы использовал хитрость, заключающуюся в использовании join
между входным набором данных и приоритетами (ранжированными).
val priorities = Seq(
"MV1",
"MV2",
"VPV",
"Others").zipWithIndex.toDF("name", "rank")
val ids = Seq(
(1, "MV1"),
(1, "MV2"),
(2, "VPV"),
(2, "Others")).toDF("id", "priority")
val mins = ids
.join(priorities)
.where($"priority" === $"name")
.groupBy("id")
.agg(min("rank") as "min")
val q = mins.join(priorities).where($"min" === $"rank").select("id", "name")
Результат, похоже, соответствует ожиданиям.
scala> q.show
+---+----+
| id|name|
+---+----+
| 1| MV1|
| 2| VPV|
+---+----+