使用正则表达式过滤基于另一个RDD的一个RDD

时间:2017-03-12 22:11:20

标签: scala apache-spark filter rdd

我有两个形式的RDD:

data_wo_header: RDD[String], data_test_wo_header: RDD[String]
scala> data_wo_header.first
res2: String = 1,2,3.5,1112486027 
scala> data_test_wo_header.first
res2: String = 1,2 

RDD2小于RDD 1.我试图通过删除regEx与RDD2匹配的元素来过滤RDD1。

上例中的1,2表示UserID,MovID。由于它在测试中存在,我想要新的RDD,以便从RDD1中删除它。

我问了一个类似的ques,但它要求对RDD进行不必要的拆分。 我正在尝试做这类事情,但它不起作用:

  def create_training(data_wo_header: RDD[String], data_test_wo_header: RDD[String]): List[String] = {

    var ratings_train = new ListBuffer[String]()
    data_wo_header.foreach(x => {
      data_test_wo_header.foreach(y => {
        if (x.indexOf(y) == 0) {
          ratings_train += x
        }
      })
    })
    val ratings_train_list = ratings_train.toList
    return ratings_train_list
  }

我应该如何进行正则表达式匹配并根据它进行过滤。

1 个答案:

答案 0 :(得分:2)

您可以使用广播变量来共享rdd2的状态,然后根据rdd2的广播变量过滤rdd1。我复制你的代码,这对我有用

def create_training(data_wo_header: RDD[String], data_test_wo_header: RDD[String]): List[String] = {

   val rdd2array = sparkSession.sparkContext.broadcast(data_test_wo_header.collect())
   val training_set = data_wo_header.filter{
       case(x) => rdd2array.value.filter(y => x.matches(y)).length == 0
   }
   training_set.collect().toList
}

还有scala和spark我建议你如果可以避免foreach并使用更多功能范例with map,flatMap和filter functions