我想过滤文件数据到每个日期的好的和坏的数据,因此会得到2个结果文件。从测试文件中,前4行需要输入正确的数据,并且在错误的数据中输入2行。火花过滤与正则表达式
我有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行的日期通过。
我再次运行测试,我仍然得到相同的结果。
能否请您提了好的和坏的数据预期的输出? – himanshuIIITian
根据正则表达式,前4行需要输入正确的数据,最后2行输入错误的数据。 –
你为什么认为你的REGEX匹配前4行?你认为'\ w(3)'?没有大括号的情况下,出现次数肯定不是3次。您的字面与'3'匹配您可以在线测试REGEX,例如这里https://regex101.com/ – AKSW