如何用正则表达式解析RDD中的字符串数组以提取指定字段?
解决Spark RDD字符串拆分的正则问题
我来帮你搞定这个正则解析的问题~你之前的正则表达式没生效主要是几个细节没处理对,咱们一步步来:
原正则的问题分析
你用的"[.]+\(([.]+)\)[.]+"有两个关键错误:
[.]是匹配单个点字符,不是你想的“任意字符”,匹配任意字符应该用.;- 没有考虑字符串里的空格分隔,而且贪婪模式会导致匹配范围超出预期,没法精准拆分出三个部分。
正确的正则表达式
针对你的固定格式字符串,推荐使用这个正则:
^(.*?) \((.*?)\) (.*)$
每个分组的作用:
(.*?):第一个非贪婪分组,匹配姓名(比如Tony Stark),直到遇到((空格+左括号)就停止;\((.*?)\):第二个分组,匹配括号里的国家(比如USA),左/右括号需要转义成\(和\);(.*)$:第三个分组,匹配从空格后到结尾的所有内容,也就是日期部分。
Spark RDD的代码实现示例
用Scala代码来演示如何在RDD中应用这个正则拆分出三个目标数组:
import scala.util.matching.Regex // 初始化输入RDD val inputRDD = sc.parallelize(Array( "Tony Stark (USA) 16th October 2015", "Peter Comb (Canada) 21st September 2015" )) // 定义正则模式 val splitPattern: Regex = "^(.*?) \\((.*?)\\) (.*)$".r // 拆分出三个RDD val namesRDD = inputRDD.map { case splitPattern(name, _, _) => name } val countriesRDD = inputRDD.map { case splitPattern(_, country, _) => country } val datesRDD = inputRDD.map { case splitPattern(_, _, date) => date } // 验证结果 println(namesRDD.collect().mkString(", ")) // 输出: Tony Stark, Peter Comb println(countriesRDD.collect().mkString(", ")) // 输出: USA, Canada println(datesRDD.collect().mkString(", ")) // 输出: 16th October 2015, 21st September 2015
这个方案能精准匹配你给出的字符串格式,只要输入的每个元素都遵循“姓名 (国家) 日期”的结构,就能稳定拆分出三个目标数组。
内容的提问来源于stack exchange,提问作者jOasis
相关产品推荐
相关产品推荐

