我有两个形式的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
}
答案 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