Я выполняю поиск приблизительно ближайших соседей, используя этап MinHashLSH, предоставленный PySpark. Кажется, это работает отлично, но результаты менялись каждый раз, когда я отображал или собирал их. Я решил решить эту проблему, сохранив фрейм данных, возвращаемый приближениями приближения, так что он будет оцениваться только один раз, однако, когда я добавил оператор 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, что было бы лучше, чем эти строки). </p>
Что такое в persist (), что приводит к сбою метода visibleNearestNeighbors ()?
Здеськак выглядит мой тестовый код (приблизительно):
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 в оператор окNNESTESTNEIGHBORTS. Я не понимаю разницу, сделанную сохранением перед vs после 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())