PySparkpersist()更改roxNearestNeighbors()的输出

时间:2019-10-22 22:12:37

标签: pyspark azure-databricks

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

0 个答案:

没有答案