【问题标题】:reduceByKey with two columns in Spark在 Spark 中有两列的 reduceByKey
【发布时间】:2015-09-07 05:27:10
【问题描述】:

我正在尝试在 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)

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

【问题讨论】:

  • 您能否提供示例输入和预期输出?

标签: python apache-spark reduce pyspark


【解决方案1】:

据我了解,您的目标是计算 (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)]

【讨论】:

    猜你喜欢
    • 2016-02-25
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2016-12-30
    相关资源
    最近更新 更多