删除两个重复的行

时间:2018-07-04 14:53:07

标签: java scala apache-spark hadoop apache-spark-dataset

各位同事,今天好。 我有一个大数据集(约2.370亿行)。 有很多列。 例如,我需要删除列名称为userIdVTS的所有重复项。

userId Vts moreColumn1 moreColumn2
10     150     2           3              -delete
11     160     1           6
10     150     0           1              -delete

我对SQL不好。尝试了与Internet不同的变体,但没有用。

更新:

请回答!我忘了说我使用Java。 有我针对Java的优化代码:

viewingDataset.groupBy("userId", "VTS")
                .count()
                .where("count = 1")
                .drop("count")
                .join(viewingDataset, JavaConversions.asScalaBuffer(asList("userId", "VTS")))

2 个答案:

答案 0 :(得分:3)

您可以汇总计数,过滤结果并重新加入

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

使用窗口函数可以获得相同的结果,但是如果数据偏斜,则健壮性将降低,并且平均而言要昂贵得多。

答案 1 :(得分:1)

您可以使用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|
+-------+----+------------+------------+