Как выбрать наиболее важные строки по назначенному приоритету? - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь преобразовать df, где дублируется идентификатор, преобразовать его в одну строку для идентификатора и взять значение из списка приоритетов.

-----------
id | value
-----------
1     MV1
1     MV2
2     VPV
2    Others

И список приоритетов:

  1. "MV1"
  2. "MV2"
  3. "VPV"
  4. "Others"

, поэтому вывод должен быть :

-----------
id | value
-----------
1     MV1
2     VPV

Я попытался создать столбец и присвоить числовое значение (mv1-> 1 mv2-> 2) и отсортировать его с помощью оконной функции, чтобы взять только первую строку, но я не думаю, что это отличное решение.

Каков оптимальный способ сделать это?

Я использую scala в качестве языка.

1 Ответ

0 голосов
/ 22 января 2020

Я бы использовал хитрость, заключающуюся в использовании 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|
+---+----+
...