我有一个关于两个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中执行此操作?
答案 0 :(得分:0)
val result = rdd.map( x => x.intersect(B))
B
和rdd
都必须具有相同的类型(在这种情况下为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)