我正在使用 approxSimilarityJoin 来查找两组之间的 Jaccard 相似度。
val dfA = hashtoseq.toDF("id","values") //values is a set of string
val hashingTF = new HashingTF().setInputCol("values").setOutputCol("features").setNumFeatures(1048576)
val featurizedData = hashingTF.transform(dfA)
val mh = new MinHashLSH()
.setNumHashTables(3)
.setInputCol("features")
.setOutputCol("hashes")
val model = mh.fit(featurizedData)
val dffilter = model.approxSimilarityJoin(featurizedData, featurizedData, 0.45)
对于 16 GB 的数据集,我得到了大约 270 GB 的随机写入,即使在服务器(3 个工作节点,每个节点有 64 GB RAM 和 64 个内核)上也需要超过 3 小时。
我浏览了以下链接:-
[ LSH Spark 永远卡在 approxSimilarityJoin() 函数上,但它对我不起作用。
我还浏览了 databricks 网站,他们将运行时与数据大小进行了比较。对于以 MB 为单位的数据,即 436 MB,大约SimilarityJoin 需要 25 分钟。对于像 GB 这样的数据集,它会产生问题。[ https://databricks.com/blog/2017/05/09/detecting-abuse-scale-locality-sensitive-hashing-uber-engineering.html]。
我们可以通过对代码/服务器配置进行一些更改来减少这种随机写入,还是 approxSimilarityJoin 函数存在问题?有没有其他有效的方法来计算大型数据集上的 Jaccard 相似度?