如何在构造RDD时跳过与模式不匹配的条目

时间:2016-02-21 20:45:07

标签: scala apache-spark

我在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])

我只对与所有模式匹配的行/记录感兴趣(即具有所有这四个字段的记录)。如何跳过那些不满足我要求的行/记录?

2 个答案:

答案 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,因为过滤器使用什么来决定是否传递记录。