删除两个重复行
Remove both duplicates row
同事们大家好。
我有一个大数据集(大约 237 000 000 行)。
有很多列。
例如,我需要删除列名 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")))
您可以使用计数进行聚合、过滤结果并返回
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|
+-------+----+------------+------------+
同事们大家好。
我有一个大数据集(大约 237 000 000 行)。
有很多列。
例如,我需要删除列名 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")))
您可以使用计数进行聚合、过滤结果并返回
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|
+-------+----+------------+------------+