我正在尝试实现 LSH spark 以在包含 50000 行和每行约 5000 个特征的非常大的数据集上为每个用户找到最近的邻居。这是与此相关的代码。
MinHashLSH mh = new MinHashLSH().setNumHashTables(3).setInputCol("features")
.setOutputCol("hashes");
MinHashLSHModel model = mh.fit(dataset);
Dataset<Row> approxSimilarityJoin = model .approxSimilarityJoin(dataset, dataset, config.getJaccardLimit(), "JaccardDistance");
approxSimilarityJoin.show();
作业卡在 approxSimilarityJoin() 函数上,永远不会超出它。请让我知道如何解决它。
最佳答案
如果您将其放置足够长的时间,它将完成,但是您可以采取一些措施来加快它的速度。查看源码可以看到算法
- 散列输入
- 在散列上加入 2 个数据集
- 使用 udf 和计算 jaccard 距离
- 使用您的阈值过滤数据集。
连接可能是这里最慢的部分,因为数据是混洗的。所以有些事情要尝试:
- 更改数据框输入分区
- 更改
spark.sql.shuffle.partitions
(加入后默认为您提供 200 个分区) - 您的数据集看起来足够小,您可以使用
spark.sql.functions.broadcast(dataset)
进行 map 端连接 - 这些 vector 是稀疏的还是密集的?该算法与
sparseVectors
配合使用效果更好。
在我始终使用 sparseVectors
的情况下,这 4 个选项中的 2 和 3 最适合我。
关于java - LSH Spark 永远停留在 approxSimilarityJoin() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927221/