Scala - 根据另一个 DF 中的事务为每个 ID 过滤 DF 中的数据

Scala - Filter data in DF for each ID based on the transactions in another DF

问题概述:

  1. 数据集 1:用户将有多行与某个交易 ID 相关联
  2. 数据集 2:每个用户都有一行与数据库中的每个交易 ID 相关联
  3. 我想做的是删除用户在数据集 1 中拥有的数据集 2 中的任何事务。

示例:

数据集 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 是我选择的语言)但我有点迷路了。如果我只使用一个 ID,我可以使用 isin 函数,但我不确定如何为所有 ID 执行此操作。

如有任何帮助,我们将不胜感激。

最简单的方法可能是使用 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|
// +---+--------+-----+