使用正则表达式进行火花过滤



我正在尝试根据日期将文件数据过滤为好数据和坏数据,因此将获得 2 个结果文件。从测试文件中,前 4 行需要输入良好数据,后 2 行需要输入错误数据。

我有 2 个问题

  1. 我没有得到任何好数据,结果文件为空
  2. 和错误的数据结果如下所示 - 仅拾取名称字符

    (,C,h( (,J,u( (,吨,小时( (,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

开头和结尾的三个"(双引号(和 .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我上面的正则表达式是错误的,我已经将其更新为。 在 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

检查了正则表达式101上的正则表达式,前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}sd{2},sd{4}|d{2}sw{3},sd{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")

上面的代码会给你以下输出 -

data/singValid

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

data/singBad

(Neli,2016,5 )
(Bilu,,5)

最新更新