3

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

4

1 回答 1

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.

于 2018-03-27T15:06:05.640 回答