Apache Spark中的空间集合操作

时间:2014-07-30 11:36:41

标签: spatial apache-spark

有没有人能够使用@ApacheSpark进行空间操作?例如两个包含线段的集合的交集?

我想交叉两组线。

这是一个一维的例子:

这两套是:

  • A = {(1,4),(5,9),(10,17),(18,20)}
  • B = {(2,5),(6,9),(10,15),(16,20)}

结果交集将是: 交叉点(A,B)= {(1,1),(2,4),(5,5),(6,9),(10,15),(16,17),(18,20)}

更多细节: - 套装有约300万件 - 集合中的线条覆盖整个范围

感谢。

2 个答案:

答案 0 :(得分:0)

你可以通过两个RDD的完整cartesian连接来解决这个问题,但这会在大规模时变得极其缓慢。如果您的问题很小,当然,这是一种简单而便宜的方法。只需在连接中的每对之间发出重叠(如果有的话)。

为了做得更好,我想你可以通过开始点对集合进行排序,然后同时遍历两者,匹配一个当前间隔与另一个间隔并发出重叠来解决这个问题。细节留给读者。

你几乎可以通过首先将A中的每个元组(x,y)映射到((x,y),'A')之类的东西,然后将其映射到B,然后取union和{{1 x值。然后,您可以sortBy遇到标记的细分流并实施您的算法。

虽然你会错过分区末端值之间的重叠,但这并不常用。我想不出一个很好的简单方法来解决这个问题。

答案 1 :(得分:0)

并行化这种方法的一种方法是创建一个大小的网格,并通过它们所属的网格来分组线段。

因此,对于大小为n的网格,您可以flatMap个坐标对(线段的段)来创建(gridId, ( (x,y), (x,y) ))键值对。

(1,3), (5,9)将映射到( (1,1), ((1,3),(5,9) ),网格大小为10 - 该线段仅存在于网格“slot”1,1中(网格从0-10,0- 10)。如果您选择较小的网格大小,则线段将平面映射到多个键值对,每个键值对对应一个网格槽。

完成后,您可以groupByKey和每个组正常计算交叉点。

这不是最有效的处理方式,特别是如果你有很长的线段跨越多个网格“插槽”,但这是一个简单的方法将问题分解为适合内存的子问题