所以我想用桶来做钥匙。我有一个类似的数据:
<a> <1, 10>
<a> <2, 12>
<b> <4, 12>
<a> <1, 20>
<a> <3, 21>
我希望通过密钥求和,但是在某种程度上我可以仅为元组中第二项的某个带宽求和。假如我说我的带宽为2,我希望得到这个输出:
<a> <3>
<a> <4>
<b> <4>
我能够通过首先将值映射到列表然后迭代并检查列表来使用reduceByKey来完成此操作。然而,对于每个键,这将需要O(n ^ 2)次,其中n是每个键的值的数量。
只是想知道在火花中是否有更简单的方法来做到这一点。尝试进行聚合,但我相信它归结为同样的事情。
更新
所以这就是我所做的。
<a> <[1,10]> <a> <[2,12]> <b> <[4,12]> <a> <[1,20]> <a> <[3,21]>
reduceByKey
,这两个条目代表<a> <[1,10]>
和<a> <a[2,20]>
,如果第二个int差异<2,我将第一个输出与<a> <[3,10]>
相加添加第一个int并保持第二个的较低值。当下一个条目从{10} |开始<a> <[1,20]>
时&gt; 2我将元组添加到列表并输出<a> <[(3,10),(1,20)]>
然后下一个获取<a> <[(3,10),(4,20)]>
希望这是有道理的。我发现它有点低效,因为列表必须适合内存,在第一种情况下,每个键的初始值减少为n(n ^ 2)。