<p>现在,更好的方法是使用<code>rdd.aggregateByKey()</code>方法。因为这个方法在Apache Spark和Python文档中的文档记录太少了--<em>这也是我编写这个Q&A</em>的原因--直到最近我一直在使用上面的代码序列。但同样,它的效率较低,因此除非有必要,否则请避免这样做。</p>
<p>下面介绍如何使用<code>rdd.aggregateByKey()</code>方法(<strong>推荐的</strong>)执行相同的操作。。。</p>
<p>按键,同时计算和(我们要计算的平均值的分子)和计数(我们要计算的平均值的分母):</p>
<pre><code>>>> aTuple = (0,0) # As of Python3, you can't pass a literal sequence to a function.
>>> rdd1 = rdd1.aggregateByKey(aTuple, lambda a,b: (a[0] + b, a[1] + 1),
lambda a,b: (a[0] + b[0], a[1] + b[1]))
</code></pre>
<p>上面每对<code>a</code>和<code>b</code>的含义如下所示(这样您就可以看到发生了什么):</p>
<pre><code> First lambda expression for Within-Partition Reduction Step::
a: is a TUPLE that holds: (runningSum, runningCount).
b: is a SCALAR that holds the next Value
Second lambda expression for Cross-Partition Reduction Step::
a: is a TUPLE that holds: (runningSum, runningCount).
b: is a TUPLE that holds: (nextPartitionsSum, nextPartitionsCount).
</code></pre>
<p>最后,计算每个键的平均值,并收集结果。</p>
<pre><code>>>> finalResult = rdd1.mapValues(lambda v: v[0]/v[1]).collect()
>>> print(finalResult)
[(u'2013-09-09', 11.235365503035176),
(u'2013-09-01', 23.39500642456595),
(u'2013-09-03', 13.53240060820617),
(u'2013-09-05', 13.141148418977687),
... snip ...
]
</code></pre>
<p>我希望这个用<code>aggregateByKey()</code>回答的问题会有帮助。</p>