以下是我在pyspark shell中尝试的代码。
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)]
为什么火花引擎无法区分不同的比特值?
答案 0 :(得分:1)
绕过问题的一种方法是使用bitarray
将所有tobytes
转换为字节。此外,在@mtoto提供的链接中讨论了问题的原因,即bitarray不维护散列不变量。
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]