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

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

MinHashLSH mh = new MinHashLSH().setNumHashTables(3).setInputCol("features") .setOutputCol("hashes"); MinHashLSHModel model = mh.fit(dataset); Dataset approxSimilarityJoin = model .approxSimilarityJoin(dataset, dataset, config.getJaccardLimit(), "JaccardDistance"); approxSimilarityJoin.show(); 

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

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

  1. 哈希输入
  2. 连接哈希上的2个数据集
  3. 使用udf和计算jaccard距离
  4. 使用您的阈值过滤数据集。

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配合sparseVectors

在这4个选项中,2和3对我来说效果最好,同时总是使用sparseVectors