RDD 交集

RDD intersections

我想查询两个 RDD 之间的交集。

我的第一个 RDD 有一个这样的元素列表:

A = List(1,2,3,4), List(4,5,6), List(8,3,1),List(1,6,8,9,2)

而第二个RDD是这样的:

B = (1,2,3,4,5,6,8,9)

(我可以将 B 作为 Set 而不是第一个存储在内存中。)

我想对 A 和 B 中的每个元素进行交集

List(1,2,3,4).intersect((1,2,3,4,5,6,8,9))
List(4,5,6).intersect((1,2,3,4,5,6,8,9))
List(8,3,1).intersect((1,2,3,4,5,6,8,9))
List(1,6,8,9,2).intersect((1,2,3,4,5,6,8,9))

我如何在 Scala 中执行此操作?

val result = rdd.map( x => x.intersect(B))

Brdd 必须具有相同的类型(在本例中为 List[Int])。另外,请注意,如果 B 很大但适合内存,您可能希望将其广播为 documented here

scala> val B = List(1,2,3,4,5,6,8,9)
B: List[Int] = List(1, 2, 3, 4, 5, 6, 8, 9)

scala> val rdd = sc.parallelize(Seq(List(1,2,3,4), List(4,5,6), List(8,3,1),List(1,6,8,9,2)))
rdd: org.apache.spark.rdd.RDD[List[Int]] = ParallelCollectionRDD[0] at parallelize at <console>:21

scala> rdd.map( x => x.intersect(B)).collect.mkString("\n")
res3: String = 
List(1, 2, 3, 4)
List(4, 5, 6)
List(8, 3, 1)
List(1, 6, 8, 9, 2)