我正在尝试在PySpark中实现locality-sensitive hashing(基于用Scala编写的spark-hash项目)。散列步骤会产生一些奇怪的行为。
在我获取为每个向量生成的minhashes列表的哈希的步骤中,其输出似乎在很大程度上取决于我是并行哈希(PySpark REPL)还是顺序哈希(在{{1}之后) })。例如,如果我以这种方式生成散列(对collect
的调用应该给我散列到相同波段的元素):
groupByKey
我得到的列表类似于你的期望;即许多独特的数字:
bands = model.signatures.groupByKey().collect()
hashes = [hash(band[1]) for band in bands]
但是,我使用完全相同的数据,但使用Spark构造散列它:
278023609,
278023657,
278023621,
278023449,
278023593,
278023589,
278023529,
278023637,
278023673,
278023429,
278023441,
...
现在我得到一个如下所示的列表:
hashes = model.signatures.groupByKey().map(lambda x: hash(x[1])).collect()
相同的哈希一遍又一遍地重复。但是,如果我使用相同的Spark构造,但在最后一秒将ResultIterable转换为冻结集:
286120785,
286120785,
286120785,
286120785,
286120785,
286120785,
286120785,
286120785,
...
现在我再次获得一个独特的哈希列表。 知道发生了什么事吗?在Spark执行期间,hashes = model.signatures.groupByKey().map(lambda x: hash(frozenset(x[1].data))).collect()
对象上的散列是如何工作的,有什么奇怪的吗?