LSH Spark永远停留在approxSimilarityJoin()函数

时间:2018-02-22 12:17:11

标签: java apache-spark locality-sensitive-hash minhash

我正在尝试实现LSH spark来为每个用户找到包含50000行和每行约5000个特征的非常大的数据集的最近邻居。以下是与此相关的代码。

LEFT JOIN

这项工作停留在approxSimilarityJoin()函数中,永远不会超越它。请让我知道如何解决它。

1 个答案:

答案 0 :(得分:3)

如果你留下足够长的时间它会完成,但是你可以采取一些措施加快速度。查看源代码,您可以看到算法

  1. 哈希输入
  2. 在哈希上加入2个数据集
  3. 使用udf和
  4. 计算jaccard距离
  5. 使用您的阈值过滤数据集。
  6. https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/feature/LSH.scala

    由于数据被洗牌,连接可能是这里的缓慢部分。所以有些事要尝试:

    1. 更改数据框输入分区
    2. 更改spark.sql.shuffle.partitions(默认情况下,在加入后为您提供200个分区)
    3. 您的数据集看起来很小,您可以使用spark.sql.functions.broadcast(dataset)进行地图端连接
    4. 这些向量是稀疏还是密集?该算法可以更好地与sparseVectors一起使用。
    5. 在这4个选项中,2和3对我来说效果最好,但始终使用sparseVectors