2017-08-13 2 views
2

Ich versuche, Dateidaten in gute und schlechte Daten pro Datum zu filtern, wird also 2 Ergebnisdateien erhalten. Aus der Testdatei müssen die ersten 4 Zeilen in gute Daten und die letzten 2 Zeilen in schlechte Daten gehen.Spark-Filterung mit Regex

I 2 Ausgaben

  1. Ich bin keine gute Daten bekommen habe, Ergebnisdatei ist leer
  2. und schlechte Daten Ergebnis sieht wie folgt aus - die Namen Zeichen nur

    Aufnehmen (, C, h) (, J, U) (, T, h) (, J, O) (, N, e) (, B, i)

Testdatei

Christopher|Jan 11, 2017|5 
Justin|11 Jan, 2017|5 
Thomas|6/17/2017|5 
John|11-08-2017|5 
Neli|2016|5 
Bilu||5 

Laden und RDD

scala> val file = sc.textFile("test/data.txt") 
scala> val fileRDD = file.map(x => x.split("|")) 

RegEx

scala> val singleReg = """(\w(3))\s(\d+)(,)\s(\d(4))|(\d+)\s(\w(3))(,)\s(\d(4))|(\d+)(\/)(\d+)(\/)(\d(4))|(\d+)(-)(\d+)(-)(\d(4))""".r 

Ist drei "(doppelte Anführungszeichen) in Anfan ng und end und .r wichtig hier?

Filter Ausgabe Bereich

scala> val validSingleRecords = fileRDD.filter(x => (singleReg.pattern.matcher(x(1)).matches)) 
scala> val badSingleRecords = fileRDD.filter(x => !(singleReg.pattern.matcher(x(1)).matches)) 

Schalten Array in String

scala> val validSingle = validSingleRecords.map(x => (x(0),x(1),x(2))) 
scala> val badSingle = badSingleRecords.map(x => (x(0),x(1),x(2))) 

Datei schreiben

scala> validSingle.repartition(1).saveAsTextFile("data/singValid") 
scala> badSingle.repartition(1).saveAsTextFile("data/singBad") 

Update 1 Mein Regex oben war falsch, ich habe es aktualisiert. in scala Backslash ein Escape-Zeichen ist, müssen so duplizieren

val singleReg = """\\w{3}\\s\\d+,\\s\\d{4}|\\d+\\s\\w{3},\\s\\d{4}|\\d+\/\\d+\/\\d{4}|\\d+-\\d+-\\d{4}""".r 

die Regex auf regex101 Geprüft und die Daten in den ersten vier Zeilen bestehen.

Ich habe den Test erneut ausgeführt und ich bekomme immer noch das gleiche Ergebnis.

+0

Können Sie bitte die erwartete Ausgabe für gute und schlechte Daten erwähnen? – himanshuIIITian

+0

Die ersten 4 Zeilen müssen in gute Daten und die letzten 2 Zeilen in schlechte Daten pro Regex gehen. –

+0

Warum denkst du, dass dein REGEX mit den ersten 4 Zeilen übereinstimmt? Was glaubst du, '' w (3) '? Die Anzahl der Vorkommen ist sicher nicht 3 ohne geschweifte Klammern. Ihr passt buchstäblich zu "3" Sie können das REGEX online testen, z. hier https://regex101.com/ – AKSW

Antwort

4

Es gibt zwei Probleme mit dem Code:

  1. Das Zeichen, das Sie die Linien der data.txt ist falsch zu spalten verwenden. Es sollte '|' statt "|" sein.
  2. Die Regex singleReg ist falsch.

Der richtige Code ist wie folgt:

Laden und RDD

scala> val file = sc.textFile("test/data.txt") 
scala> val fileRDD = file.map(x => x.split('|')) 

RegEx

scala> val singleReg = """\w{3}\s\d{2},\s\d{4}|\d{2}\s\w{3},\s\d{4}|\d{1}\/\d{2}\/\d{4}|\d{2}-\d{2}-\d{4}""".r 

Filter

scala> val validSingleRecords = fileRDD.filter(x => (singleReg.pattern.matcher(x(1)).matches)) 
scala> val badSingleRecords = fileRDD.filter(x => !(singleReg.pattern.matcher(x(1)).matches)) 

Schalten Array in String

scala> val validSingle = validSingleRecords.map(x => (x(0),x(1),x(2))) 
scala> val badSingle = badSingleRecords.map(x => (x(0),x(1),x(2))) 

Datei schreiben

scala> validSingle.repartition(1).saveAsTextFile("data/singValid") 
scala> badSingle.repartition(1).saveAsTextFile("data/singBad") 

Der obige Code wird Ihnen folgende Ausgabe -

Daten/singValid

(Christopher,Jan 11, 2017,5) 
(Justin,11 Jan, 2017,5) 
(Thomas,6/17/2017,5) 
(John,11-08-2017,5) 

Daten/singBad

(Neli,2016,5) 
(Bilu,,5) 
+0

Mit Splitting auf Komma oder Leerzeichen verwenden wir "," oder "", warum mit Rohr wir Verwenden Sie ein einzelnes Anführungszeichen als '|'? –

+0

Die Antwort auf Ihre Frage ist hier - https://stackoverflow.com/questions/47867743/scala-splitting-with-double-quotes-vs-single-quotes – himanshuIIITian