PySpark groupByKey找到元组长度

时间:2016-02-22 22:10:48

标签: python apache-spark pyspark

我的问题是基于this question的第一个答案。我想计算钥匙的元素,我怎么能这样做?

example = sc.parallelize([(alpha, u'D'), (alpha, u'D'), (beta, u'E'), (gamma, u'F')])


abc=example.groupByKey().map(lambda x : (x[0], list(x[1]))).collect()
# Gives [(alpha, [u'D', u'D']), (beta, [u'E']), (gamma, [u'F'])]

我想输出类似下面的内容

alpha:2,beta:1, gamma:1

我开始知道答案如下。为什么这么复杂?有一个更简单的答案吗?是否包含键+所有值?为什么我不能做len(s)-1我在哪里减去一个删除键[0]

map(lambda s: (s[0], len(list(set(s[1])))))

1 个答案:

答案 0 :(得分:1)

嗯,这并不复杂。你真正需要的是另一个字数:

from operator import add

example.map(lambda x: (x[0], 1)).reduceByKey(add)

如果您打算collect,您甚至可以countByKey

example.countByKey()

你真的不想在这里使用groupByKey,但假设毕竟有一些隐藏的理由来应用它:

example.groupByKey().mapValues(len)

为什么len(s) - 1不起作用?仅仅因为example是成对RDD,或者换句话说它包含键值对。同样的事情适用于groupByKey的结果。这意味着len(s)始终等于2。