各位同事,今天好。
我有一个大数据集(约2.370亿行)。
有很多列。
例如,我需要删除列名称为userId
,VTS
的所有重复项。
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")))
答案 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|
+-------+----+------------+------------+