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()函数,永远不会超越它。 请让我知道如何解决它。
如果你留下足够长的时间它会完成,但是你可以采取一些措施加快速度。 查看源代码,您可以看到算法
- 哈希输入
- 连接哈希上的2个数据集
- 使用udf和计算jaccard距离
- 使用您的阈值过滤数据集。
由于数据被洗牌,连接可能是这里的缓慢部分。 所以有些事要尝试:
- 更改您的数据框输入分区
- 更改
spark.sql.shuffle.partitions
(默认情况下,在连接后为您提供200个分区) - 您的数据集看起来很小,您可以使用
spark.sql.functions.broadcast(dataset)
进行地图侧连接 - 这些向量是稀疏还是密集? 该算法可以更好地与
sparseVectors
配合sparseVectors
。
在这4个选项中,2和3对我来说效果最好,同时总是使用sparseVectors
。
- 缓存()/ persist()的apache-spark内存消耗
- Apache Spark中的矩阵乘法
- 使用带有ScalaObjectMapper的Jackson模块在Spark 1.4.0上运行作业时出错
- 带有DataFrame API的Apache Spark MLlib在createDataFrame()或read()时会产生java.net.URISyntaxException .csv(…)
- Spark Kafka流媒体问题
- RDD不可序列化的Cassandra / Spark连接器java API
- 无法执行超过火花作业“初始作业未接受任何资源”
- Spark DataFrame – 选择n个随机行
- 如何为每个记录生成唯一ID