当键是bitarray类型时,reduceByKey无法正常工作

时间:2017-03-29 17:13:03

标签: python apache-spark pyspark

以下是我在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)]

为什么火花引擎无法区分不同的比特值?

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]