您好,我正在使用 BucketedRandomProjectionLSH
(2 个桶 3 个哈希表)算法在约 300,000 条记录的数据集中查找相似的人。我正在为每个记录创建一个稀疏的二元组向量(每个向量中有 1296 个维度),并对数据集进行近似相似性自连接,正如我提到的那样,数据集并不太大。
在 3 节点 spark 集群(主节点:m3.xlarge,核心节点:2 m4.4xlarge)上,大约需要 7 个小时才能完成。
性能太慢,我正在寻找某人可能为该算法创建的一些基准。此外,有关如何调整此算法的任何指导都将非常有帮助。
这是供您引用的代码片段:
val rdd=sc.loadFromMongoDB(ReadConfig(Map("uri" -> "mongodb://localhost:27017/Single.master","readPreference.name" -> "secondaryPreferred")))
val aggregatedRdd = rdd.withPipeline(Seq(Document.parse("{$unwind:'$sources'}"),Document.parse("{$project:{_id:0,id:'$sources._id',val:{$toLower:{$concat:['$sources.first_name','$sources.middle_name','$sources.last_name',{$substr:['$sources.gender',0,1]},'$sources.dob','$sources.address.street','$sources.address.city','$sources.address.state','$sources.address.zip','$sources.phone','$sources.email']}}}}")))
val fDF=aggregatedRdd.map(line=>line.values()).map(ll=>bigramMap(ll.toArray)).toDF("id","idx","keys")
val columnNames = Seq("idx","keys")
val result = fDF.select(columnNames.head, columnNames.tail: _*)
val brp = new BucketedRandomProjectionLSH().setBucketLength(2).setNumHashTables(3).setInputCol("keys").setOutputCol("values")
val model = brp.fit(result)
var outDD=model.approxSimilarityJoin(result, result, 100).filter("datasetA.idx < datasetB.idx").select(col("datasetA.idx").alias("idA"),col("datasetB.idx").alias("idB"),col("distCol"))
最佳答案
我尝试使用 BucketedRandomProjectionLSH 处理 10,000,000 个数据。 需要3个小时。 我之前只存储了Dataframe的现金。
df.persist()
关于scala - BucketedRandomProjectionLSH 的性能 (org.apache.spark.ml.feature.BucketedRandomProjectionLSH),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43927844/