Scala - фильтрация данных в DF для каждого идентификатора на основе транзакций в другом DF - PullRequest
1 голос
/ 08 ноября 2019

Обзор проблемы:

  1. Набор данных 1: у пользователей будет несколько строк, связанных с некоторым идентификатором транзакции
  2. Набор данных 2: У каждого пользователя будет строка, связанная с каждым идентификатором транзакции вбаза данных
  3. Я хотел бы удалить все транзакции в наборе данных 2, которые есть у пользователя в наборе данных 1.

Пример:

Набор данных 1:

id trans_id
1  a
1  b
1  c
2  c
2  d
2  e
2  f

Набор данных 2:

id trans_id score
1  a        0.3
1  b        0.4
1  c        0.5
1  d        0.1
1  e        0.2
1  f        0.5
2  a        0.1
2  b        0.5
2  c        0.6
2  d        0.8
2  e        0.9
2  f        0.2

Окончательный набор данных:

id trans_id score
1  d        0.1
1  e        0.2
1  f        0.5
2  a        0.1
2  b        0.5

Я пытаюсь сделать это в Scala (Python - мой выбор) иЯ немного растерялся. Если бы я работал только с одним идентификатором, я мог бы использовать функцию isin, но я не уверен, как это сделать для всех идентификаторов.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 08 ноября 2019

Самый простой способ - использовать left_anti соединение:

val df1 = Seq(
  (1, "a"), (1, "b"), (1, "c"),
  (2, "c"), (2, "d"), (2, "e"), (2, "f")
).toDF("id", "trans_id")

val df2 = Seq(
  (1, "a", 0.3), (1, "b", 0.4), (1, "c", 0.5), (1, "d", 0.1), (1, "e", 0.2), (1, "f", 0.5),
  (2, "a", 0.1), (2, "b", 0.5), (2, "c", 0.6), (2, "d", 0.8), (2, "e", 0.9), (2, "f", 0.2)
).toDF("id", "trans_id", "score")

df2.join(df1, Seq("id", "trans_id"), "left_anti").show
// +---+--------+-----+
// | id|trans_id|score|
// +---+--------+-----+
// |  1|       d|  0.1|
// |  1|       e|  0.2|
// |  1|       f|  0.5|
// |  2|       a|  0.1|
// |  2|       b|  0.5|
// +---+--------+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...