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

Pyspark-在groupByKey之后,根据键计算不同的值?,pyspark,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])

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

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)]
我对spark非常陌生,并尝试在某个地方应用distinct()函数,但都失败了:-(
非常感谢!

您可以使用set而不是list-

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

您可以尝试多种方法来解决相同的问题。我使用以下方法解决了此问题:-

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)]

希望这对您有所帮助。

请在您的答案中添加一些解释。