2017-03-29 3 views
0

以下は、pysparkシェルで試しているコードです。予想キーがbitarray型の場合、reduceByKeyが期待どおりに機能しない

from bitarray import bitarray 
a = bitarray('0') * 5 
b = bitarray('1') * 5 
c = [a.copy() for x in range(3)] 
d = [b.copy() for x in range(5)] 
e = c + d 
rdd = sc.parallelize(e).map(lambda x : (x, 1)).reduceByKey(lambda x, y : x + y).collect() 
print(rdd) 

[(bitarray('11111'), 5), (bitarray('00000'), 3) 

実際の出力:

[(bitarray('11111'), 1), (bitarray('00000'), 1), (bitarray('11111'), 1), (bitarray('11111'), 1), (bitarray('00000'), 1), (bitarray('11111'), 1), (bitarray('00000'), 1), (bitarray('11111'), 1)] 

なぜ異なるbitarray値を区別することができ、エンジンを点火されていませんか?

+0

a [0]とa [1]のハッシュと等価は何ですか?私はid(a [0])を介して表示されますが、実際にはpythonの男ではないと信じています –

+3

これは可能だとは思わない、ここを参照http://stackoverflow.com/a/29725381/4964651 – mtoto

+0

ありがとう@mtoto!それが問題を検証します。ハッシュは平等でなければならない。 –

答えて

1

この問題を回避する方法の1つは、tobytesを使用してbitarrayをすべてバイトに変換することです。また、問題の原因は、ビット配列がハッシュ不変を維持しない@mtotoによって提供されるリンクで説明されています。

from bitarray import bitarray 

def back2Bit(U): 
     res = bitarray() 
     res.frombytes(U) 
     return res 

a = bitarray('0') * 5 
b = bitarray('1') * 5 
c = [a.copy() for x in range(3)] 
d = [b.copy() for x in range(5)] 
e = c + d 
rdd = sc.parallelize([x.tobytes() for x in e]).map(lambda x : (x, 1)).reduceByKey(lambda x, y : x + y).collect() 
rdd = [(back2Bit(x[0]), x[1]) for x in rdd] 
関連する問題