gpt4 book ai didi

java - 使用 Spark [`cartesian()` 问题创建邻居矩阵]

转载 作者:可可西里 更新时间:2023-11-01 16:12:08 26 4
gpt4 key购买 nike

我是 Spark 初学者,我面临以下问题:我有一个项目集合(假设它们是笛卡尔坐标或二维点),我想获取每个项目的附近元素。决定一个项目是否靠近另一个取决于一个函数(假设我们想要所有欧几里德距离小于给定值的点)。

当然,获得一个点的邻居是微不足道的,我已经做到了。只需过滤 项目即可。我不能做的是为集合中的所有点获取它们,我不知道如何有效地做到这一点。

我在这里写了一个我想从一个小数据集中得到的结果的例子,以更清楚地说明我的需求:

sourceData = [ (0,1) , (1,1), (0,0), (50,10), (51,11)  ]
result = [
(0,1) => [(1,1), (0,0)],
(1,1) => [(0,1), (0,0)],
(0,0) => [(0,1), (1,1)],
(50,10) => [(51,11)],
(51,11) => [(50,10)]
]

您知道如何以有效的方式做到这一点吗?

到目前为止,我已经试过了:

return sourceData.cartesian(sourceData)
.filter(new PairNeighborFilter<T>())
.groupByKey();

 public class PairNeighborFilter<T extends DbScanPoint> implements Function<Tuple2<T, T>, Boolean> {

/**
*
*/
private static final long serialVersionUID = 1L;
public static double eps;


@Override
public Boolean call(Tuple2<T, T> v1) throws Exception {
return v1._1().distanceTo(v1._2()) <= eps && !v1._1().equals(v1._2());
}


}

但我确实认为这是一种非常低效的方法。此外,稍后我需要计算每个键的元素,这只能迭代所有元素并计算它们,这是性能的另一个耻辱。我想要一个 JavaRDD 类作为 JavaPairRDD 的值,而不是 Iterable,这可能吗?

谢谢。

最佳答案

为了有效地找到邻居,您可能希望避免进行完整的笛卡尔积,因为它是 O(n^2) 操作。一种替代方法是使用局部敏感哈希来识别一组较小的候选点对,然后计算候选点对之间的确切距离。 (这是一种“近似”最近邻方法,因为任何特定点的一些真正的最近邻可能不会散列到与所讨论的点相同的桶中。)

a few ANN/LSH Spark packages可用于此。

关于java - 使用 Spark [`cartesian()` 问题创建邻居矩阵],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com