RDD交叉口

时间:2015-12-13 15:35:23

标签: scala intersection rdd

我有一个关于两个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中执行此操作?

1 个答案:

答案 0 :(得分:0)

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)