减速机的多输出,带状和

时间:2015-02-20 17:00:16

标签: apache-spark

所以我想用桶来做钥匙。我有一个类似的数据:

<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是每个键的值的数量。

只是想知道在火花中是否有更简单的方法来做到这一点。尝试进行聚合,但我相信它归结为同样的事情。

更新

所以这就是我所做的。

  1. 将每个值映射为列表,以获得类似:
  2. <a> <[1,10]>
    <a> <[2,12]>
    <b> <[4,12]>
    <a> <[1,20]>
    <a> <[3,21]>
    
    1. 致电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)]>
    2. 最后,我只是将其映射为获取键和元组的第一个值
    3. 希望这是有道理的。我发现它有点低效,因为列表必须适合内存,在第一种情况下,每个键的初始值减少为n(n ^ 2)。

0 个答案:

没有答案