Rav*_*avi 1 python reduce apache-spark pyspark
我正在尝试按 Spark 中的两列进行分组,并使用 reduceByKey 如下:
pairsWithOnes = (rdd.map(lambda input: (input.column1,input.column2, 1)))
print pairsWithOnes.take(20)
Run Code Online (Sandbox Code Playgroud)
上面的地图命令工作正常,并产生三列,第三列全是一列。我尝试按前两列对第三列求和,如下所示:
reduced = pairsWithOnes.reduceByKey(lambda a,b,c : a+b+c)
print reduced.take(20)
Run Code Online (Sandbox Code Playgroud)
但是,运行最后一个打印命令会引发错误“解包的值太多”。有人可以指导我以正确的方式将其减少两列吗?
据我了解,您的目标是计算(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)
Run Code Online (Sandbox Code Playgroud)
结果:
[Row(column1=0, column2=0),
Row(column1=4, column2=4),
Row(column1=3, column2=2)]
Run Code Online (Sandbox Code Playgroud)
首先,您必须按 (column1, column2) 分组:
pairsWithOnes = rdd.map(lambda input: ((input.column1, input.column2), 1))
pairsWithOnes.take(3)
Run Code Online (Sandbox Code Playgroud)
结果:
[((0, 0), 1), ((4, 4), 1), ((3, 2), 1)]
Run Code Online (Sandbox Code Playgroud)
剩下的很简单reduceByKey
:
pairsWithOnes.reduceByKey(lambda x, y: x + y).take(3)
Run Code Online (Sandbox Code Playgroud)
结果
[((1, 3), 37), ((3, 0), 43), ((2, 1), 40)]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3782 次 |
最近记录: |