我正在使用PySpark提供的MinHashLSH阶段执行“ reportNearestNeighbors”搜索。这似乎效果很好,但是每次我显示或收集它们时,结果都在不断变化。我想通过持久保存由roxNearestNeighbors返回的数据帧来解决此问题,使其仅求值一次,但是当我添加persist()语句时,结果变得不准确。
没有persist语句,我的结果如下:
|Id|JaccardDistance|
|--|---------------|
|15| 0|
|76| 0.1|
|42| 0.15|
但是坚持下去,我得到了这些结果:
|Id|JaccardDistance|
|--|---------------|
|91| 0.91|
|02| 0.88|
|59| 0.87|
这些绝对不是不是最近的3个邻居或附近的任何东西(有更多行,其距离<0.2会比这些行更好)。
与persist()有关的是什么导致了近似NearestNeighbors()失败?
这是我的测试代码的样子(大约):
def search():
reference = spark.sql("select * from reference_table").persist()
model = PipelineModel.load("/models/hashing_model")
key = Vectors.sparse(100, [1,4,5,11,57], [1,1,1,1,1])
nearest_neighbors = model.stages[-1].approxNearestNeighbors(reference, key, 3).select("Id", "JaccardDistance")
nearest_neighbors = nearest_neighbors.withColumn("score", scoring_udf)
return nearest_neighbors.persist()
display(search())
编辑:我能够通过将persist语句移到roxNearestNeighbors语句来解决此问题。我不明白在withColumn之前和之后坚持存在的区别。
def search():
reference = spark.sql("select * from reference_table").persist()
model = PipelineModel.load("/models/hashing_model")
key = Vectors.sparse(100, [1,4,5,11,57], [1,1,1,1,1])
nearest_neighbors = model.stages[-1].approxNearestNeighbors(reference, key, 3).select("Id", "JaccardDistance").persist()
nearest_neighbors = nearest_neighbors.withColumn("score", scoring_udf)
return nearest_neighbors
display(search())