如何从pyspark中的foldByKey输出元组?

How to output a tuple from foldByKey in pyspark?

我正在练习 foldByKey 在输出中生成元组。

我有一些输入形式:

    x = sc.parallelize([[1,2],[3,4],[5,6],[1,1],[1,3],[3,2],[3,6]])

将其转换为成对的 rdd:

    x2 = x.map(lambda y: (y[0],y[1]))

我想要输入中每个键的两个值:一个是添加属于每个键的所有元素,另一个只是计算每个键的元素数。

所以,输出应该是这样的:

    [(1,(6,3)),(3,(12,3)),(5,(6,1))]

我试过代码如下:

    x3 = x2.foldByKey((0,0), lambda acc,x: (acc[0] + x,acc[1] + 1))

但是,我收到了这个错误:

    TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

我不明白 acc[0] 和 acc[1] 是元组。它们应该是整数。

我收到这个错误是因为 foldByKey return 类型应该与输入的 RDD 元素类型相同(根据定义)。我已经将一个元组 RDD 传递给 foldByKey,我想要一个整数作为它的 return 值。我试图实现的目标可以通过 aggregateByKey() 来完成,因为它可以 return 与其 RDD 输入类型不同的类型。

如果我将一个元组传递给 foldByKey,我会得到正确的输出:

     x2 = x.map(lambda y: (y[0],(y[0],y[1])))
     x3 = x2.foldByKey((0,0), lambda acc,x: (acc[0] + x[0],acc[1] + 1))
     
     [(1, (3, 2)), (5, (5, 1)), (3, (9, 2))]

欢迎大家多提建议