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

问题描述 投票:0回答:1

问题概述:

  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进行此操作。

任何帮助将不胜感激。

scala dataframe filter mapreduce
1个回答
0
投票
最简单的方法可能是使用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| // +---+--------+-----+

© www.soinside.com 2019 - 2024. All rights reserved.