2016-12-06 1 views
0

Ich habe einen Datensatz, der ein Datensatz von String ist, und es hat die DatenHerauszufinden Duplikate in einem Datensatz in scala

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

Ich möchte die doppelten Zeilen in einem Datensatz, um herauszufinden, wie ich tun, dass ? Ich möchte die Duplikate entfernen. Im Beispiel ist die doppelte Zeile 12348,5,233,234559,4 und ich möchte nur eine einzige Instanz davon ausgeben.

Wie gehe ich vor?

Antwort

0

Dimas Antwort funktionieren soll. Hier ist eine andere Lösung.

I denke (nicht positiv)groupby würde alle Daten im Speicher halten .. also vielleicht wäre das besser für Sie.

Ich bin neu zu scala selbst, ich habe tatsächlich eine Weile damit verbracht, dies als Praxis haha ​​zu beantworten. Verwirrend, aber es macht Sinn!

Denken Sie an eine Karte wie ein Wörterbuch. Sie können Paare darin speichern. In scala können Sie ein Schlüssel/Wert-Paar hinzufügen/aktualisieren, indem Sie ein Paar hinzufügen. Map(b -> 4) + ("c" -> 2) würde Map(b -> 4, c -> 2) zurückgeben. Erweiternd gibt Map(b -> 4, c -> 2) + ("b" -> 1)Map(b -> 1, c -> 2) zurück. Was acc ist (aus Gründen der Klarheit in Zählung umbenannt) ist der Akkumulator eines wachsenden Objekts, wenn der Iterator gefaltet ist. Jedes Mal, wenn es eine neue Zeile trifft, prüft es, ob diese Zeile bereits in der Map enthalten ist (wiederum Think Dictionary). Wenn der Wert dort ist, nimmt es den vorherigen Wert mit getOrElse und fügt 1 hinzu, aktualisiert dann die ACC-Map mit dem neuen Paar, oder es initialisiert es bei eins, wenn es noch nicht existiert (da es das erste Mal war Reihe wurde gesehen).

Hier ist der beste Blog, den ich fürs Lernen Faltung gefunden habe. Der Autor beschreibt es prägnant und genau: https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright

+0

Danke, das hat funktioniert. Sehr geschätzt. Kannst du das bitte erklären - (count, row) => count + (row -> (count.getOrElse (row, 0) + 1)) .. ich bin neu in scala. – user3897533

+0

Sie denken, 'Map' speichert keine Daten im Speicher? : D – Dima

+0

Hey @ user3897533, in einer Erklärung oben hinzugefügt. Scala kann schwierig sein! Dima, ich verstehe, dass das Gedächtnis nutzen wird. Wie viel davon war ich unsicher? Get lines gibt einen Iterator zurück und faltet einfach über diesen Iterator, so dass ich nicht dachte, dass die gesamte Datei tatsächlich gespeichert wird, um diese Operation auszuführen. Ist das falsch? Ich gab auch an, dass ich nicht positiv war und nur eine andere Lösung anbot. –

-1

Wenn Sie Scala-Sammlungen verwenden (wie Seq, List), haben Sie eine Methode namens .distinct. Ansonsten kann man es in einem Set verwandeln, die Duplikate von Standard entfernt (aber nicht konservieren nicht die Reihenfolge)

1

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

Verwandte Themen