2016-02-17 1 views
2

Вход:Как удалить дубликаты из файла, когда другие поля меняются. Мы должны просто удалить дубликаты на основе одного столбца

abc 1001 3452 2463 2343 2176 7654 3452 8765 5643 3452 
abc 1000 3452 2463 2343 2176 7654 3452 8765 5643 3452 
tas 3420 3562 2123 1343 2176 7654 3252 8765 5643 3452 
aer 1000 3452 2463 2343 2176 7654 3452 8765 5643 3452 
tas 3420 3562 2123 1343 2176 7654 3252 8765 5643 3452 
abc 1002 3452 2463 2343 2176 7654 3452 8765 5643 3452 
tas 3420 3562 2123 1343 2176 7654 3252 8765 5643 3452 
aer 1000 3452 2463 2343 2176 7654 3452 8765 5643 3452 
tas 3420 3562 2123 1343 2176 7654 3252 8765 5643 3452 

Выход (любое одно значение с ABC, TAS, AER):

Я получил эту работу с Скале. Есть ли какой-либо искровой эквивалент для выполнения этой операции.

Scala код:

import scala.io.Source 
import java.io._ 
import scala.util.control._ 
val filename = sc.textFile("filenamelocation") 
val new_file = new PrintWriter(new File("filenamelocation")) 
val new_file1 = new PrintWriter(new File("filenamelocation")) 
// for (line <- Source.fromFile(filename).getLines) 
for (line <- filename.map(x +> x.split(" ").slice(0,3))) 
    { 
     val first_row=line 
     val firstWords = first_row.split(" ")(0) 
     // println(firstWords) 
     //println(line) 
     // val list2Add = List(4,5,6) 
     new_file.write(firstWords+"\n") 
    } 
// println(list2Add) 
new_file.close 
val list = scala.io.Source.fromFile("filenamelocation", "utf-8").getLines.toList 
val l2 = list.removeDuplicates 
for (e <- l2) 
    { 
     val loop = new Breaks; 
     loop.breakable 
      { 
       for (line1 <- Source.fromFile(filename).getLines) 
        { 
         val first_row1=line1 
         val firstWords1 = first_row1.split(" ")(0) 
         if (e == firstWords1) 
          { 
           new_file1.write(line1+"\n") 
           loop.break; 
          } 
        } 
       } 
    } 
new_file1.close 

код Спарк трудится на:

import scala.io.Source 
import java.io._ 
import scala.util.control._ 
val filename = sc.textFile("filelocation") 
val test = filename.map(line => line.split(" ")(0)) 
val distinct = test.distinct().saveAsTextFile("/user/asugured/test1.txt") 
// distinct.foreach(println) 
val filename1 = sc.textFile("/user/asugured/test1.txt") 

Я stucked, как итерировать оба файл в цикле, как я это сделал в Scala.

Не могли бы вы предложить, как с этим справиться.

ответ

3

Этот код Scala, вероятно, является наихудшим из всех, что я когда-либо видел. К счастью, вопрос не в этом!

Вы можете использовать reduceByKey в Apache Spark, и просто держите одну сторону всегда. Например:

val lines = sc.textFile(inputPath) 
val keyed = lines.map(line => line.split(" ")(0) -> line) 
val deduplicated = keyed.reduceByKey((a, b) => a) 
// Write out the deduplicated lines. 
deduplicated.values.saveAsTextFile(outputPath) 

reduceByKey объединяет все значения, принадлежащие ключу. Его можно использовать для суммирования чисел ((a, b) => a + b), взяв максимум ((a, b) => a max b) и для решения других проблем.

+0

'Seq' также имеет метод' reduce', поэтому вы можете использовать ту же идею без Spark. –

+0

Спасибо за ответ. Даниэль Дарабос - новый для scala и искра, благодаря исправлению меня. Не могли бы вы помочь мне с кодом scala, используя этот код для создания сопоставленных файлов, но я получил оттуда попытку со вчерашнего дня. import scala.io.Source import java.io._ import scala.util.control._ val keyed = Source.fromFile ("/ home/asugured/breast/Cases.raw"). GetLines.toSeq.map (line => line.split ("") (0) -> line) val deduplicated = keyed.reduce ((x, y) => y) –

+0

Нет проблем, надеюсь, вам понравится изучение Scala/Spark! Моя ошибка для рекомендации 'Seq.reduce', она не уменьшает ключ, поэтому в этой ситуации это не очень полезно. Сожалею. Вместо этого: 'keyed.groupBy (_._ 1) .values.map (_. Head._2)' (Попробуйте выполнить эту операцию по-разному, чтобы понять, что происходит. Или прочитайте документацию. Или спросите о переполнении стека :) .) –

Смежные вопросы