同事们,今天好。我有一个很大的数据集(大约237000行)。有很多专栏。例如,我需要删除列名为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")))发布于 2018-07-04 15:07:11
您可以使用计数进行聚合,过滤结果并返回。
df.groupBy("userId", "Vts").count
.where($"count" === 1)
.drop("count")
.join(df, Seq("userId", "Vts"))窗口函数有可能得到同样的结果,但如果数据倾斜,而且平均花费要高得多,那么它的鲁棒性就会降低。
发布于 2018-07-04 15:16:15
您可以使用窗口功能实现您想要的结果:
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|
+-------+----+------------+------------+https://stackoverflow.com/questions/51176408
复制相似问题