我在使用pyspark的ALS算法之后使用了LSH,一切似乎都很好,直到我在探索过程中意外地发现我有一些丢失的行。所有这些都是在Spark LSH文档示例https://spark.apache.org/docs/latest/ml-features.html#tab_scala_28的帮助下实现的
当我专门尝试查找idA == 1所在的行时,我可以做到。当我重新分区(1)时,.write.csv或idA --> ==为1的所有行都不在表中。有人能解释一下这是怎么回事吗?
我已经使用了python API for Spark版本v2.2.0,python版本是3.6
一点代码
brp = BucketedRandomProjectionLSH(inputCol="features", outputCol="hashes",
bucketLength=10.0, numHashTables=3)
table = model.approxSimilarityJoin(Pred_Factors, Pred_Factors, threshold=10.0, distCol="EuclideanDistance") \
.select(col("datasetA.id").alias("idA"),
col("datasetB.id").alias("idB"),
col("EuclideanDistance")).cache()

附言:我甚至尝试过将文件写入csv并搜索这些id和EuclidianDistance -正如你所看到的,这都是不成功的。这些丢失的id确实太多了(不仅仅是id= 1)。也许我不了解LSH算法的一些细节,但我自己找不到spark LSH行为的逻辑。
发布于 2017-10-24 20:40:32
在这里,你使用了随机分区,因此你就有了问题。所以现在你必须使用partitionBy(('idA'),否则你可以使用table.orderBy('idA')来获得正确的结果。
https://stackoverflow.com/questions/46910016
复制相似问题