2016-12-06 22 views
0

で、データセット内の重複を見つける、私は文字列のデータセットでデータセットを持っており、それは私がデータセット内の重複行を把握したいデータScalaの

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であり、出力するインスタンスは1つだけです

どうやってそれをやりますか?

答えて

0

でそれを変換することができます。ここに別の解決策があります。

I 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 

私はスカラ自身に新しいです、私は実際にこれを練習hahaとして答える間に過ごしました。混乱しますが、意味があります!

辞書のようなマップを考えてみましょう。あなたはそれにペアを格納することができます。スカラーでは、キー/値のペアを追加/更新することができます。 Map(b -> 4) + ("c" -> 2)Map(b -> 4, c -> 2)を返します。それを拡大すると、Map(b -> 4, c -> 2) + ("b" -> 1)Map(b -> 1, c -> 2)を返します。どのaccが(明瞭にするためにcountから名前を変更したか)は、反復子が折り畳まれるにつれて成長するオブジェクトのアキュムレータです。新しい行にヒットするたびに、その行がマップにまだあるかどうかを確認しています(もう一度、think辞書)。値がある場合は、前の値をgetOrElseとし、その値に1を加え、その新しいペアでaccマップを更新するか、まだ存在しない場合は1に初期化します(最初の行が見えた)。

ここで私は折り畳みを学ぶために見つけた最高のブログです。著者はそれを簡潔かつ正確に説明しています。https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright

+0

ありがとうございました。とても有難い。あなたは説明してください - (count、row)=> count +(row - >(count.getOrElse(row、0)+ 1))..私はscalaを初めて使っています。 – user3897533

+0

'Map'はデータをメモリに保持しません。 :D – Dima

+0

Hey @ user3897533、上記の説明で追加されました。 Scalaは扱いにくいです!ディマ、私はこれが記憶を使うことを理解する。どのくらい私は確信していたものです。線を取得するとイテレータが返され、折りたたむだけでイテレータが繰り返されるため、この操作を行うためにファイル全体が実際に格納されたとは思われませんでした。それは間違っていますか?また、私は肯定的ではなく、単に別の解決策を提示しているだけだと述べました。 –

-1

スカラコレクション(SeqListなど)を使用する場合は、.distinctというメソッドがあります。そうしないと、ディマスの答えは動作するはずです、デフォルトでは、重複を削除します(ただし順序を節約しません)Set

1

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