Scala 如何跳过没有';在构造RDD时不匹配模式

Scala 如何跳过没有';在构造RDD时不匹配模式,scala,apache-spark,Scala,Apache Spark,我正在RDD上进行一些模式匹配,只想选择那些与模式匹配的行/记录。这是我目前拥有的 val idPattern = """Id="([^"]*)""".r.unanchored val typePattern = """PostTypeId="([^"]*)""".r.unanchored val datePattern = """CreationDate="([^"]*)""".r.unanchored val tagPattern = """Tags="([^"]*)""".r.unan

我正在RDD上进行一些模式匹配,只想选择那些与模式匹配的行/记录。这是我目前拥有的

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])
我只对与所有模式匹配的行/记录感兴趣(即,具有所有这四个字段的记录)。如何跳过不满足要求的行/记录?

使用过滤器API

val projectedPostAnswers = postsAnswers.filter(line => f(line)).map{....
创建一个函数“f”,为您进行数据清理。确保函数返回true或false,因为这是筛选器用来决定是否传递记录的内容。

您可以使用它一步完成筛选和映射

例如,如果您知道这些字段在输入中的顺序,则可以将正则表达式合并为一个,并使用单个大小写:

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()
无关-它不会将整个数据集收集到驱动程序内存中