删除行中的两个重复项

olmpazwi  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(351)

同事们好。我有一个很大的数据集(大约23700000行)。有很多列。例如,我需要删除所有具有列名的重复项 userId , VTS .

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")))
zd287kbt

zd287kbt1#

您可以使用窗口功能实现所需的功能:

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|
+-------+----+------------+------------+
disbfnqx

disbfnqx2#

您可以使用count进行聚合,过滤结果并重新联接

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

使用窗口函数可以得到相同的结果,但如果数据倾斜,则鲁棒性较差,平均而言,成本更高。

相关问题