基于谓词

时间:2016-03-17 00:00:10

标签: scala apache-spark

我有

val foo: RDD[T]
val bar: RDD[T]
val f: (T, T) => Boolean

如果不调用collect(),我怎样才能找到foo成员bar导致f成为true的成员?

具体来说,在我的情况下,T是2D线,f检查几何交叉点。我正在查找跨越任何foo行的所有bar行。

1 个答案:

答案 0 :(得分:1)

val intersections = foo.cartesian(bar).filter{ case (a,b) =>f(a,b) }.map(_._1).unique()

但这会很慢。

基于逻辑的替代解决方案:“交叉至少一个”的集合= total_set - “相交无”的集合。因此将问题转换为查找不与任何foo相交的bar。我打算用伪代码编写这个解决方案。

while condition
      select randomly one bar
      collect foo's that intersect bar in remaining_foos
      update remaining_foos by filtering on previously collected foo's
apply above solution looking for opposite relation

在实施条件中,可以是固定数量的步骤和/或将remaining_foos的大小减小到可接受的水平。

使用广播也分发收集的foo的