2015-06-21 85 views
1

我试图通过星火两列做组和正在使用reduceByKey如下:reduceByKey在星火两列

pairsWithOnes = (rdd.map(lambda input: (input.column1,input.column2, 1))) 
print pairsWithOnes.take(20) 

上述地图命令工作正常,并产生三列,第三个是所有那些。我试图通过前两列求和的第三如下:

reduced = pairsWithOnes.reduceByKey(lambda a,b,c : a+b+c) 
print reduced.take(20) 

然而,在运行最后的印刷指令抛出一个错误“太多值解压”。有人能以正确的方式引导我将其减少两列吗?

+0

你能提供例如输入和预期的输出? – zero323

回答

3

据我了解你的目标是数(column1,input.column2)对你的输入看起来或多或少是这样的:

from numpy.random import randint, seed 
from pyspark.sql import Row 

seed(323) 

rdd = sc.parallelize(
    Row(column1=randint(0, 5), column2=randint(0, 5)) for _ in range(1000)) 
rdd.take(3) 

结果:

[Row(column1=0, column2=0), 
Row(column1=4, column2=4), 
Row(column1=3, column2=2)] 

首先你通过一个必须组(column1,column2):

pairsWithOnes = rdd.map(lambda input: ((input.column1, input.column2), 1)) 
pairsWithOnes.take(3) 

结果:

[((0, 0), 1), ((4, 4), 1), ((3, 2), 1)] 

所有什么剩下的就是简单reduceByKey

pairsWithOnes.reduceByKey(lambda x, y: x + y).take(3) 

结果

[((1, 3), 37), ((3, 0), 43), ((2, 1), 40)]