Pyspark中的AggregateByKey未提供预期输出
我有一个RDD,它有2个分区和键值对数据作为值: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:
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()