0

我在使用 pyspark 的 ALS 算法之后使用了 LSH,一切似乎都很好,直到我意外地看到我在探索过程中丢失了一些行。所有这些都是在 Spark LSH 文档示例https://spark.apache.org/docs/latest/ml-features.html#tab_scala_28的帮助下实现的

当我专门尝试查找 idA == 1 的行时 - 我可以做到。当我执行 repartition(1).write.csv 或排序时-> idA == 1 的所有行都不在表中。有人可以解释这怎么可能?

我已经为 Spark 版本 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()

在此处输入图像描述

PS 我什至尝试将文件写入 csv 并搜索这些 id 和 EuclidianDistance - 如您所见,这一切都不成功。这些丢失的 id 实在太多了(这不仅适用于 id = 1)。也许我不了解 LSH 算法的一些细节,但我自己找不到 spark LSH 行为的逻辑。

4

1 回答 1

0

在这里,您使用了随机分区,因此您遇到了问题。所以现在你必须使用,partitionBy(('idA')否则你可以使用table.orderBy('idA')正确的结果。

于 2017-10-24T12:40:32.367 回答