【问题标题】:Creating a matrix of neighbors with Spark [`cartesian()` issue]使用 Spark 创建邻居矩阵 [`cartesian()` 问题]
【发布时间】:2015-04-27 23:11:45
【问题描述】:

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

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

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

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,这可能吗?

谢谢。

【问题讨论】:

    标签: java hadoop apache-spark bigdata cartesian-product


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。这似乎证实了我的想法,即需要一种近似方法来实现可扩展性
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多