删除两个重复行

Remove both duplicates row

同事们大家好。 我有一个大数据集(大约 237 000 000 行)。 有很多列。 例如,我需要删除列名 userIdVTS.

的所有重复项
userId Vts moreColumn1 moreColumn2
10     150     2           3              -delete
11     160     1           6
10     150     0           1              -delete

我不喜欢SQL。尝试过来自互联网的不同变体,但它不起作用。

更新:

谢谢你的回答!我忘了说我使用 java。 java:

有我的优化代码
viewingDataset.groupBy("userId", "VTS")
                .count()
                .where("count = 1")
                .drop("count")
                .join(viewingDataset, JavaConversions.asScalaBuffer(asList("userId", "VTS")))

您可以使用计数进行聚合、过滤结果并返回

df.groupBy("userId", "Vts").count
  .where($"count" === 1)
  .drop("count")
  .join(df, Seq("userId", "Vts"))

使用 window 函数可以获得相同的结果,但如果数据倾斜且平均成本更高,则结果不那么稳健。

您可以通过 Window 函数实现您想要的:

import org.apache.spark.sql.expressions.Window._

ds.withColumn("aux", count("*")
.over(Window.partitionBy($"userId", $"VTS")))
.where($"aux"===1)
.drop($"aux")

partitionBy 将根据您作为参数发送的列(在您的示例中为 userId 和 VTS)计算分区有多少元素。 然后使用 where 子句,我们将仅保留计数为 1 的分区中的行,即唯一行。

partitionBY 子句的结果

ds.withColumn("aux", count("*").over(Window.partitionBy($"userId", $"VTS"))).show

+-------+----+------------+------------+---+
| userId| VTS| moreColumn1| moreColumn2|aux|
+-------+----+------------+------------+---+
|     10| 150|           2|           3|  2|
|     10| 150|           0|           1|  2|
|     11| 160|           1|           6|  1|
+-------+----+------------+------------+---+

最终结果

+-------+----+------------+------------+
| userId| VTS| moreColumn1| moreColumn2|
+-------+----+------------+------------+
|     11| 160|           1|           6|
+-------+----+------------+------------+