Pyspark - 在groupByKey之后并根据键计算不同的值?

时间:2017-07-11 02:10:18

标签: pyspark

我想根据键找到多少个不同的值,例如,假设我有

x = sc.parallelize([("a", 1), ("b", 1), ("a", 1),  ("b", 2), ("a", 2)])

我已经完成了使用groupByKey

sorted(x.groupByKey().map(lambda x : (x[0], list(x[1]))).collect())
x.groupByKey().mapValues(len).collect()

输出将由like,

[('a', [1, 1, 2]), ('b', [1, 2])]
[('a', 3), ('b', 2)]

但是,我想在列表中找到不同的值,输出应该是,

[('a', [1, 2]), ('b', [1, 2])]
[('a', 2), ('b', 2)]

我很新兴火花并尝试在某处应用distinct()函数,但都失败了:-( 非常感谢提前!

2 个答案:

答案 0 :(得分:1)

您可以使用set而不是list -

sorted(x.groupByKey().map(lambda x : (x[0], set(x[1]))).collect())

答案 1 :(得分:0)

您可以尝试多种方法。我用下面的方法解决了它: -

from operator import add
x = sc.parallelize([("a", 1), ("b", 1), ("a", 1),  ("b", 2), ("a", 2)])
x = x.map(lambda n:((n[0],n[1]), 1))
x.groupByKey().map(lambda n:(n[0][0],1)).reduceByKey(add).collect()

<强>输出: -

[('b', 2), ('a', 2)]

希望这会对你有帮助。