我正在尝试按日期筛选文件数据,将其分为好数据和坏数据,因此将获得2个结果文件。从测试文件中,前4行需要进入好数据文件,最后2行进入坏数据文件。
我有两个问题:
1. 我没有得到任何好的数据,结果文件为空。 2. 坏数据结果看起来像下面这样 - 只取名字字符 (,C,h) (,J,u) (,T,h) (,J,o) (,N,e) (,B,i) 测试文件
我有两个问题:
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
这里的三个"(双引号)和.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
在regex101上检查正则表达式,前4行的日期都经过了验证。
我已经再次运行测试,但仍然得到相同的结果。
\w(3)
是什么意思?不加花括号,出现次数肯定不是3。你的正则表达式只匹配了数字3
。你可以在网上测试正则表达式,例如在这里https://regex101.com/。 - UninformedUser