0

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

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

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

我怎样才能做到这一点?

谢谢。马可

4

2 回答 2

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
})
于 2015-03-15T00:38:12.167 回答
-2

如果我正确理解了您的问题,它看起来确实适合组合器函数之一——看看不同版本的aggregateByKeyreduceByKey函数,两者都位于此处

于 2015-03-15T01:18:35.887 回答