使用排序找不到行,在LSH之后写

时间:2017-10-24 11:59:45

标签: apache-spark pyspark spark-dataframe locality-sensitive-hash

我在使用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()

enter image description here

P.S我甚至试图将文件写入csv并搜索这些id和EuclidianDistance - 因为你可以看到这些都是不成功的。这些丢失的ID真的太多了(不仅仅是id = 1)。也许我不了解LSH算法的一些细节,但我自己也找不到火花LSH行为的逻辑。

1 个答案:

答案 0 :(得分:0)

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