原始数据
cls, id
----
a, 1
a, 1
----
b, 3
b, 3
b, 4预期输出
cls, id
----
a, 1
----
b, 3
b, 4id只能在同一个cls中重复,即同一个cls之间不存在相同的id。
那样的话。
df.dropDuplicates($id) 将跨所有分区进行洗牌,通过日志服务检查重复项。并重新分区为200(默认值)
现在,如何对每个分区分别运行dropDuplicates,以降低计算成本?
就像这样
df.foreachPartition(_.dropDuplicates())发布于 2017-02-17 14:23:02
你可能想要这样的东西:
val distinct = df.mapPartitions(it => {
val set = Set();
while (it.hasNext) {
set += it.next()
}
return set.iterator
});发布于 2021-04-11 00:35:45
而不是with set。事实上,如果数据量很大,Set就太危险了。您可以想到的一种选择是添加mapPartitionsWithIndex并将索引作为输出迭代器添加。这样,分区索引就存在于您的DF中。稍后,通过传递分区号和另一个键来应用drop duplicates。理想情况下,对于键和映射分区的组合,可以删除重复的记录。
https://stackoverflow.com/questions/42290248
复制相似问题