删除每个分区的重复项

时间:2017-02-17 05:41:40

标签: apache-spark apache-spark-sql

原始数据

cls, id  
----
a, 1
a, 1
----
b, 3
b, 3
b, 4

预期产出

cls, id  
----
a, 1
----
b, 3
b, 4

id只能在相同的cls中重复,这意味着在clses中不存在相同的id。

在那种情况下。

df.dropDuplicates($id) 

将遍历所有分区以检查cls上的重复项。并重新分配到200(默认值)

现在,我如何单独为每个分区运行dropDuplicates以降低计算成本?

类似

df.foreachPartition(_.dropDuplicates())

2 个答案:

答案 0 :(得分:0)

你可能会这样:

val distinct = df.mapPartitions(it => {
    val set = Set();
    while (it.hasNext) {
        set += it.next()
    }
    return set.iterator
});

答案 1 :(得分:0)

不是与集合。事实上,如果数据量很大,Set 就太危险了。 您可以想到的一种选择是添加 mapPartitionsWithIndex 并将索引添加为输出迭代器。这样在你的 DF 中,分区索引就存在了。稍后,通过传递分区号和另一个键来应用删除重复项。理想情况下,对于键和映射分区的组合,重复记录将被删除。

相关问题