Pyspark中的AggregateByKey未提供预期输出

Pyspark中的AggregateByKey未提供预期输出,pyspark,rdd,Pyspark,Rdd,我有一个RDD,它有2个分区和键值对数据作为值: rdd5.glom().collect() [[(u'hive',1),(u'python',1),(u'spark',1),(u'hive',1), (u'spark',1),(u'python',1)],[(u'spark',1),(u'java',1), (u'java',1),(u'spark',1)]] 当我执行aggregateByKey rdd6=rdd5.aggregateByKey((0,0), lambda acc,val:

我有一个RDD,它有2个分区和键值对数据作为值:

rdd5.glom().collect()
[[(u'hive',1),(u'python',1),(u'spark',1),(u'hive',1), (u'spark',1),(u'python',1)],[(u'spark',1),(u'java',1), (u'java',1),(u'spark',1)]]

当我执行
aggregateByKey

rdd6=rdd5.aggregateByKey((0,0), lambda acc,val: (acc[0]+1,acc[1]+val), lambda acc1,acc2 : (acc1[1]+acc2[1])/acc1[0]+acc2[0])
这并没有给我预期的结果:

输出:

[(u'python',(2,2)),(u'spark',1),(u'java',(2,2)),(u'hive',(2, 2) )]

预期:

[(u'python',1),(u'spark',1),(u'java',1),(u'hive',1)]


我可以在一个分区中看到密钥,但并没有给出预期的输出。要实现这一点,我应该做哪些更改?

好的,下面是使用reduceByKey和aggregateByKey实现这一点的方法

aggregateByKey的问题是,最后一个函数负责添加两个累加器。它必须返回与所有其他函数相同的结构,以便在添加另一个新累加器(来自另一个分区)时,它将再次工作

它与combineByKey非常相似,请参见

[(u'spark',(4,4)),(u'java',(2,2)),(u'hive',(2,2)),(u'python', (2,2))]

[(u'spark',(4,4)),(u'java',(2,2)),(u'hive',(2,2)),(u'python', (2,2))]

如果尝试平均这些值,可以在末尾添加另一个mapValues,如下所示:

print rdd.aggregateByKey( (0, 0),\
                         lambda acc, val: (acc[0] + 1,acc[1] + val),\
                         lambda acc1, acc2 : (acc1[0] + acc2[0], acc1[1] + acc2[1]))\
                        .mapValues(lambda x: x[1] * 1.0 / x[0])\
                        .collect()
[(u'spark',1.0),(u'java',1.0),(u'hive',1.0),(u'python',1.0)]


你想干什么?为什么期望得到[(u'python',1),(u'spark',1),(u'java',1),(u'hive',1)]?我对spark是新手,学习所有转换。实际上,我想要输入中每个技能的平均值。试图了解AggregateByKey转换及其用法平均值是多少?价值呢?
print rdd.aggregateByKey( (0, 0),\
                         lambda acc, val: (acc[0] + 1,acc[1] + val),\
                         lambda acc1, acc2 : (acc1[0] + acc2[0], acc1[1] + acc2[1]))\
                        .mapValues(lambda x: x[1] * 1.0 / x[0])\
                        .collect()