在Spark中有两列的reduceByKey

时间:2015-06-21 19:28:33

标签: python apache-spark reduce pyspark

我正在尝试在Spark中按两列进行分组,并使用reduceByKey,如下所示:

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

上面的maps命令工作正常并产生三列,第三列是全部列。我尝试将前三列的第三列求和如下:

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

但是,运行最后一个打印命令会引发错误“解压缩的值太多”。有人可以用正确的方式指导我减少两列吗?

1 个答案:

答案 0 :(得分:4)

据我所知,你的目标是计算(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)]