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

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

我正在尝试实现 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() 函数上,永远不会超出它。请让我知道如何解决它。

最佳答案

如果您将其放置足够长的时间,它将完成,但是您可以采取一些措施来加快它的速度。查看源码可以看到算法

  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) 进行 map 端连接
  4. 这些 vector 是稀疏的还是密集的?该算法与 sparseVectors 配合使用效果更好。

在我始终使用 sparseVectors 的情况下,这 4 个选项中的 2 和 3 最适合我。

关于java - LSH Spark 永远停留在 approxSimilarityJoin() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927221/

相关文章:

java - 未封闭的字 rune 字

java - Android - Chronometer setBase() 无法正常工作

java - mTLS/TLS Redis 6 问题 Java

java - 收集后从 Spark Map 操作中获取 null 图形字段

java.lang.IllegalArgumentException : Invalid lambda deserialization 异常

python - 错误 "AttributeError: ' Py4JError'对象没有属性 'message'构建DecisionTreeModel

locality-sensitive-hash - 如何使用Locality Sensitive Hash --LSHKIT

algorithm - 使用 min-hash 实现局部敏感散列

java - JPA - 无效的 persistence.xml

algorithm - 高维空间的近似最近邻 (A1NN)