2

我正在尝试在 PySpark 中实现局部敏感散列(基于spark-hash项目,用 Scala 编写)。散列步骤正在产生一些奇怪的行为。

在我获取为每个向量生成的 minhashes 列表的哈希值的步骤中,其输出似乎很大程度上取决于我是并行哈希(PySpark REPL)还是顺序哈希(之后collect)。例如,如果我以这种方式生成散列(调用groupByKey应该给我散列到同一波段的元素):

bands = model.signatures.groupByKey().collect()
hashes = [hash(band[1]) for band in bands]

我得到了一个类似于您所期望的列表;即,许多独特的数字:

278023609,
278023657,
278023621,
278023449,
278023593,
278023589,
278023529,
278023637,
278023673,
278023429,
278023441,
...

但是,我采用完全相同的数据,但使用 Spark 构造对其进行哈希处理:

hashes = model.signatures.groupByKey().map(lambda x: hash(x[1])).collect()

现在我得到一个如下所示的列表:

286120785,
286120785,
286120785,
286120785,
286120785,
286120785,
286120785,
286120785,
...

相同的哈希一遍又一遍地重复。但是,如果我使用相同的 Spark 构造,但在最后一秒将 ResultIterable 转换为frozenset:

hashes = model.signatures.groupByKey().map(lambda x: hash(frozenset(x[1].data))).collect()

现在我再次得到一个唯一哈希列表。知道发生了什么吗?ResultIterable在 Spark 执行期间,散列在对象上的工作方式有什么奇怪的吗?

4

0 回答 0