2017-08-13 174 views
2

我想過濾文件數據到每個日期的好的和壞的數據,因此會得到2個結果文件。從測試文件中,前4行需要輸入正確的數據,並且在錯誤的數據中輸入2行。火花過濾與正則表達式

我有2個問題

  1. 我沒有得到任何好數據,結果文件是空
  2. 和壞數據的結果看起來像下面 - 拿起名稱的字符只有

    ( ,C,H) (,J,U) (,T,H) (,J,O) (N,E) (,B,I)

測試文件

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 

加載和RDD

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

正則表達式

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 

是在beginni三「(雙引號) ng和end和.r在這裏很重要?

過濾 問題區域

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

開啓數組轉換爲字符串

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

寫文件

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

更新1 我上面的正則表達式是錯誤的,我已經更新爲。在階反斜槓是一個轉義字符,所以需要複製

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 

經過正則表達式上regex101並且在第一4行的日期通過。

我再次運行測試,我仍然得到相同的結果。

+0

能否請您提了好的和壞的數據預期的輸出? – himanshuIIITian

+0

根據正則表達式,前4行需要輸入正確的數據,最後2行輸入錯誤的數據。 –

+0

你爲什麼認爲你的REGEX匹配前4行?你認爲'\ w(3)'?沒有大括號的情況下,出現次數肯定不是3次。您的字面與'3'匹配您可以在線測試REGEX,例如這裏https://regex101.com/ – AKSW

回答

4

有2個問題的代碼:

  1. 的字符,你正在使用拆分的data.txt行是錯誤的。它應該是'|'而不是"|"
  2. 正則表達式singleReg是錯誤的。

正確的代碼如下所示:

加載和RDD

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

正則表達式

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 

過濾

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

開啓數組轉換爲字符串

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

寫文件

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

上面的代碼將會給你下面的輸出 -

數據/ singValid

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

數據/ singBad

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

添加了更新1在逗號或空格處分割我們使用「,」或「」,爲什麼使用管道使用單引號作爲'|'? –

+0

您的查詢的答案在這裏 - https://stackoverflow.com/questions/47867743/scala-splitting-with-double-quotes-vs-single-quotes – himanshuIIITian