我有
val foo: RDD[T]
val bar: RDD[T]
val f: (T, T) => Boolean
如果不调用collect()
,我怎样才能找到foo
成员bar
导致f
成为true
的成员?
具体来说,在我的情况下,T
是2D线,f
检查几何交叉点。我正在查找跨越任何foo
行的所有bar
行。
答案 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的