私はPySpark (Scala で書かれたspark-hashプロジェクトに基づく) で局所性に敏感なハッシュを実装しようとしています。ハッシュのステップで奇妙な動作が発生しています。
各ベクトルに対して生成された minhash のリストのハッシュを取得するステップでは、この出力は、並列 (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 コンストラクトを使用し、最後の 1 秒で ResultIterable をfrozenset にキャストした場合:
hashes = model.signatures.groupByKey().map(lambda x: hash(frozenset(x[1].data))).collect()
ここで、一意のハッシュのリストを再度取得します。何が起こっているのか分かりますか?ResultIterable
Spark の実行中にオブジェクトに対してハッシュがどのように機能するかについて何かおかしなことはありますか?