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

Gou*_*eru 3 java minhash locality-sensitive-hash apache-spark

我正在尝试实现 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();
Run Code Online (Sandbox Code Playgroud)

作业卡在 approxSimilarityJoin() 函数上,永远不会超出它。请让我知道如何解决它。

小智 9

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

  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.

在这 4 个选项 2 和 3 中,我一直使用sparseVectors.