PySpark persist () изменяет вывод ок .NearestNeighbors () - PullRequest
0 голосов
/ 23 октября 2019

Я выполняю поиск приблизительно ближайших соседей, используя этап 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...