Spark:从频率值获取累积频率

时间:2015-03-14 09:13:28

标签: apache-spark cumulative-frequency

我的问题在单节点环境中回答相当简单,但我不知道如何在分布式Spark环境中做同样的事情。我现在拥有的是频率曲线",其中每个项目我都有它出现的次数。例如,它可能是这样的:(1, 2), (2, 3), (3,1)表示1次出现2次,2次出现3次,等等。

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

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

我该怎么做?

感谢。 马可

2 个答案:

答案 0 :(得分:1)

我不认为你想要的东西可以作为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
})

答案 1 :(得分:-2)

如果我理解你的问题,它看起来非常适合其中一个合成器功能 - 看一下 aggregateByKey reduceByKey 功能的不同版本位于here