火花:从频率值获取累积频率



我的问题在单节点环境中回答起来相当简单,但我不知道如何在分布式Spark环境中做同样的事情。我现在有一个"频率图",其中每个项目都有它出现的次数。例如,它可能是这样的:(1, 2), (2, 3), (3,1)这意味着 1 发生了 2 次,2 3 次,依此类推。

我想得到的是每个项目的累积频率,所以我需要从上面的实例数据中获得的结果是:(1, 2), (2, 3+2=5), (3, 1+3+2=6) .

到目前为止,我已经尝试通过使用mapPartitions来做到这一点,如果只有一个分区,它会给出正确的结果......否则显然没有。

我该怎么做?

谢谢。马可

我认为你想要的不可能作为 Spark 中的分布式转换,除非你的数据足够小,可以聚合到一个分区中。Spark 函数的工作原理是将作业分发到远程进程,而通信的唯一方法是使用返回某个值的操作或使用累加器。不幸的是,累加器不能被分布式作业读取,它们是只写的。

如果你的数据足够小,可以容纳在单个分区/进程上的内存中,你可以合并(1),然后你现有的代码就可以工作了。如果不是,但内存中可以容纳单个分区,则可以使用本地迭代器:

var total = 0L
rdd.sortBy(_._1).toLocalIterator.foreach(tuple => {
    total = total + tuple._2;
    println((tuple._1, total)) // or write to local file
})

如果我正确理解了你的问题,它看起来确实适合其中一个组合器函数——看看不同版本的 aggregateByKeyreduceByKey 函数,两者都位于这里。

相关内容

  • 没有找到相关文章

最新更新