我遇到一个问题,我有一组密钥和一组(更大)的记录,我希望在密钥之间聚合。我遇到的问题是每个密钥的记录数量变化很大。单个键可以有数百万个映射到它的记录,而大量的键只有1-5个记录映射到它们。最终目标是聚合值(存储在列表中)。现在,这就是我在做的事情:
data = sc.textFile("my/path/to/file/*).map(lambda x: x.split(","))
kv = data.map(lambda x: (x[0],x[1:])
kv.take(4)看起来像这样:
("key1", [1, 2, 3, 4]), ("key1", [1, 2, 3, 4]), ("key2", [1, 1, 1, 1]), ("key2", [0, 1, 0, 1])
现在,我正在执行kv.reduceByKey(lambda a,b: a+b)
。然后我执行迭代加法方法以产生以下输出:
("key1", [2, 4, 6, 8]), ("key2", [1, 2, 1, 2])
然而,我注意到reduceByKey
花了很长时间。鉴于,这是一个洗牌操作,这需要时间。但我也知道,每个密钥记录数量的严重不平衡可能导致不太理想的线程处理,因为记录不是均匀分布在密钥上。
我是否认为记录/密钥的不平衡可能导致经济放缓?我该怎么做才能解决这个问题?我听说过顺便提到的腌制,但我不确定如何实施。