我有一个数据集,它是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
,我只想输出它的单个实例
我该如何去做?
答案 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集合(例如Seq
,List
),则会有一个名为.distinct
的方法。否则,您可以在Set
中对其进行转换,默认情况下会删除重复项(但不保留订单)