我在使用pyspark的ALS算法之后使用了LSH,所有看起来都很好,直到我意外地看到我在探索期间有一些丢失的行。所有这些都是在Spark LSH文档示例https://spark.apache.org/docs/latest/ml-features.html#tab_scala_28
的帮助下实现的当我专门尝试找到idA == 1的行时 - 我可以做到。当我重新分区(1).write.csv或排序 - >所有idA == 1的行都不在表中。有人可以解释一下这有可能吗?
我已经在Spark Version v2.2.0中使用了python API, 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()
P.S我甚至试图将文件写入csv并搜索这些id和EuclidianDistance - 因为你可以看到这些都是不成功的。这些丢失的ID真的太多了(不仅仅是id = 1)。也许我不了解LSH算法的一些细节,但我自己也找不到火花LSH行为的逻辑。
答案 0 :(得分:0)
这里你使用了随机分区,因为你遇到了问题。所以现在你必须使用partitionBy(('idA')
,否则你可以使用table.orderBy('idA')
来获得正确的结果。