在scala中查找数据集中的重复项

时间:2016-12-06 23:30:45

标签: scala duplicates

我有一个数据集,它是String的DataSet,它有数据

12348,5,233,234559,4
12348,5,233,234559,4
12349,6,233,234560,5
12350,7,233,234561,6

我想找出数据集中的重复行,我该怎么做?我想删除重复项。在示例中,重复的行是12348,5,233,234559,4,我只想输出它的单个实例

我该如何去做?

3 个答案:

答案 0 :(得分:1)

dataSet.groupBy(identity).collect { case (k,v) if v.size > 1 => k }

答案 1 :(得分:1)

迪马斯的回答应该有效。这是另一种解决方案。

认为(不是正面的) groupby会将所有数据保存在内存中......所以也许这对你来说会更好。

val rows = scala.io.Source.fromFile("data.txt") // Assuming data is in a file
             .getLines  // Create an iterator from lines in file
             .foldLeft(Map.empty[String, Int]){ // Fold over empty Map
                (acc, row) => acc + (row -> (acc.getOrElse(row, 0) + 1))}  // Keep accumulator to track of row counts as fold is done
             .filter(t => t._2 > 1)  // Filter to tuples with more than one row

我自己是scala的新手,我实际上花了一段时间来回答这个习惯哈哈。令人困惑,但这很有道理!

将地图视为字典。您可以在其中存储对。在scala中,您可以通过向其添加一对来添加/更新键/值对。 Map(b -> 4) + ("c" -> 2)将返回Map(b -> 4, c -> 2)。展开后,Map(b -> 4, c -> 2) + ("b" -> 1)会返回Map(b -> 1, c -> 2)。 acc(为了清晰而重新命名)是迭代器折叠时增长对象的累加器。每次它到达一个新行时,它都会检查该行是否还在Map中(再次,想想字典)。如果值在那里,它将前一个值与getOrElse相加并向其添加1,然后使用该新对更新acc map,或者如果它尚不存在则将其初始化为1(因为它是第一次看到这一行。)

这是我发现学习折叠的最佳博客。作者简明扼要地描述了它:https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright

答案 2 :(得分:-1)

如果您使用scala集合(例如SeqList),则会有一个名为.distinct的方法。否则,您可以在Set中对其进行转换,默认情况下会删除重复项(但不保留订单)