我在RDD上进行一些模式匹配,并且只想选择匹配模式的thoese行/记录。这是我现在拥有的,
val idPattern = """Id="([^"]*)""".r.unanchored
val typePattern = """PostTypeId="([^"]*)""".r.unanchored
val datePattern = """CreationDate="([^"]*)""".r.unanchored
val tagPattern = """Tags="([^"]*)""".r.unanchored
val projectedPostsAnswers = postsAnswers.map {line => {
val id = line match {case idPattern(x) => x}
val typeId = line match {case typePattern(x) => x}
val date = line match {case datePattern(x) => x}
val tags = line match {case tagPattern(x) => x}
Post(Some(id),Some(typeId),Some(date),Some(tags))
}
}
case class Post(Id: Option[String], Type: Option[String], CreationDate: Option[String], Tags: Option[String])
我只对与所有模式匹配的行/记录感兴趣(即具有所有这四个字段的记录)。如何跳过那些不满足我要求的行/记录?
答案 0 :(得分:2)
您可以使用RDD.collect(scala.PartialFunction f)一步完成过滤和映射。
例如,如果您知道输入中这些字段的顺序,则可以将正则表达式合并为一个并使用单个案例:
val pattern = """Id="([^"]*).*PostTypeId="([^"]*).*CreationDate="([^"]*).*Tags="([^"]*)""".r.unanchored
val projectedPostsAnswers = postsAnswers.collect {
case pattern(id, typeId, date, tags) => Post(Some(id), Some(typeId), Some(date), Some(tags))
}
返回的RDD[Post]
只包含此案例匹配的记录。请注意,此collect(PartialFunction)
与collect()
无关 - 它不将整个数据集收集到驱动程序内存中。
答案 1 :(得分:1)
使用过滤器API。
val projectedPostAnswers = postsAnswers.filter(line => f(line)).map{....
创建一个功能' f'这可以帮助您清理数据。确保函数返回true或false,因为过滤器使用什么来决定是否传递记录。