【问题标题】:Separating unique and duplicate entries between two dataframes在两个数据框之间分离唯一和重复的条目
【发布时间】:2018-03-06 02:29:46
【问题描述】:

我将文件加载到数据框中,在将数据框保存到表中之前,我想检查数据框中的任何行是否已存在于表中。

例如 我的表有以下架构

A  B  C 
1  2  3 
2  4  5

我的数据框有以下内容

A  B  C
1  2  5 
2  3  5

唯一性的定义是 A & B 列的组合。因此,在上面的示例中,重复条目是 (1, 2, 5),因为数据框和表都具有 (1, 2) 作为 A & B 的值。唯一记录是 (2,3,5),因为表没有 (2,3) 作为 A & B 的值。

所以我想要的输出是两个数据框。一个包含唯一的,即 (2,3,5),另一个包含重复的,即 (1,2,5)。

让我们将我当前的数据框称为 df1 并将表加载后的数据框称为 df2。

【问题讨论】:

  • 这可以通过连接来解决。你有没有尝试过?
  • 我试图加入但不知道除了功能。我试图在一次操作中完成所有操作。

标签: scala apache-spark


【解决方案1】:

首先,为了获得重复的行,加入数据框,例如:

val df2alias = "df2"
val resultColumns = df2.columns.map(colName => s"$df2alias.$colName")

val duplicates = df1.join(df2.as(df2alias))
  .where(df1("A") === df2("A") && df1("B") === df2("B"))
  .select(resultColumns.head, resultColumns.tail:_*)

duplicates 仅包含 (1, 2, 5) 行。

其次,使用duplicates获取唯一行:

val uniques = df2.except(duplicates)

uniques 仅包含 (2, 3, 5) 行。

【讨论】:

  • 我看到我不能说 .select(df2.columns) 而不是 .select(df2("A"), df2("B"), df2("C") )。它只接受列数组吗?
  • @Peter:我将答案更改为从 df2 获取结果数据框中的所有列。
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多