【问题标题】:Scala - Filter data in DF for each ID based on the transactions in another DFScala - 根据另一个 DF 中的事务为每个 ID 过滤 DF 中的数据
【发布时间】:2020-03-04 14:24:15
【问题描述】:

问题概述:

  1. 数据集 1:用户将有多个与某个事务 ID 关联的行
  2. 数据集 2:每个用户都有一行与数据库中的每个事务 ID 相关联
  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 是我选择的语言),但我有点迷茫。如果我只使用一个 ID,我可以使用 isin 函数,但我不确定如何对所有 ID 执行此操作。

任何帮助将不胜感激。

【问题讨论】:

    标签: scala dataframe filter mapreduce


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-06
      • 2017-04-22
      • 2020-09-16
      • 2021-05-21
      • 2021-09-07
      • 2020-12-29
      • 2012-10-12
      • 2020-10-24
      相关资源
      最近更新 更多