【问题标题】:PySpark groupByKey finding tuple lengthPySpark groupByKey 查找元组长度
【发布时间】:2016-02-22 22:10:47
【问题描述】:

我的问题是基于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

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

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

【问题讨论】:

  • 这并不复杂。我们这样做的方式是因为它基于map-reduce 范式,它基于转换和归约。
  • 我不能是alpha:2,beta:1, gamma:2,应该是alpha:2,beta:1, gamma:1

标签: python apache-spark pyspark


【解决方案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。

【讨论】:

  • 感谢您的回答。但是有可能解释为什么map(lambda s: (s[0], len(list(set(s[1]))))) 有效吗? s 是否包含键 + 所有值?为什么我不能做 len(s)-1 减去一个来删除键 s[0]
  • 您的更新有帮助。但是我的abc rdd 不是由一个元组(key:value1,value2 value3 等)组成吗?打印 abc 给我Gives [(alpha, [u'D', u'D']), (beta, [u'E']), (gamma, [u'F'])]。
  • 没有。它是(键,值)
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多