【问题标题】:Scala/Spark drop duplicates based in other column specific value [duplicate]Scala/Spark 删除基于其他列特定值的重复项 [重复]
【发布时间】:2019-03-08 13:17:36
【问题描述】:

我想删除在其他列中没有特定值的具有相同 ID 的重复项(在这种情况下,按那些具有相同 ID 且值 = 1 的行进行过滤) 输入df:

+---+-----+------+
| id|value|sorted|
+---+-----+------+
|  3|    0|     2|
|  3|    1|     3|
|  4|    0|     6|
|  4|    1|     5|
|  5|    4|     6|
+---+-----+------+

我想要的结果:

+---+-----+------+
| id|value|sorted|
+---+-----+------+
|  3|    1|     3|
|  4|    1|     5|
|  5|    4|     6|
+---+-----+------+

【问题讨论】:

  • @user6910411 不,因为该用户希望根据其他列的最大值删除重复项,在这种情况下是按特定值

标签: scala apache-spark dataframe filter duplicates


【解决方案1】:

可以通过获取值为“1”的行,然后使用原始数据左连接来完成:

val df = List(
  (3, 0, 2),
  (3, 1, 3),
  (4, 0, 6),
  (4, 1, 5),
  (5, 4, 6)
).toDF("id", "value", "sorted")

val withOne = df.filter($"value" === 1)
val joinedWithOriginal = df.alias("orig").join(withOne.alias("one"), Seq("id"), "left")
val result = joinedWithOriginal
  .where($"one.value".isNull || $"one.value" === $"orig.value")
  .select("orig.id", "orig.value", "orig.sorted")

result.show(false)

输出:

+---+-----+------+
|id |value|sorted|
+---+-----+------+
|3  |1    |3     |
|4  |1    |5     |
|5  |4    |6     |
+---+-----+------+

【讨论】:

  • 行得通!如果我想删除那些在具有相同 ID 的其他列中具有空值的行怎么办?
  • 原始数据框“df”可以在“val withOne”语句之前使用“.isNull”列过滤。
猜你喜欢
  • 1970-01-01
  • 2017-02-10
  • 2019-10-09
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多