Python 在pySpark中获得每组前N项

Python 在pySpark中获得每组前N项,python,apache-spark,Python,Apache Spark,我使用的是Spark 1.6.2,我有以下数据结构: sample = sqlContext.createDataFrame([ (1,['potato','orange','orange']), (1,['potato','orange','yogurt']), (2,['vodka','beer','vodka']), (2,['vo

我使用的是Spark 1.6.2,我有以下数据结构:

sample = sqlContext.createDataFrame([
                    (1,['potato','orange','orange']),
                    (1,['potato','orange','yogurt']),
                    (2,['vodka','beer','vodka']),
                    (2,['vodka','beer','juice', 'vinegar'])

    ],['cat','terms'])
我想提取前N个最常见的条款每猫。我已经开发了下面的解决方案,看起来很有效,但是我想看看是否有更好的方法来实现这一点

from collections import Counter
def get_top(it, terms=200):
    c = Counter(it.__iter__())
    return [x[0][1] for x in c.most_common(terms)]

( sample.select('cat',sf.explode('terms')).rdd.map(lambda x: (x.cat, x.col))
 .groupBy(lambda x: x[0])
 .map(lambda x: (x[0], get_top(x[1], 2)))
 .collect()
)
它提供以下输出:

[(1, ['orange', 'potato']), (2, ['vodka', 'beer'])]
这和我想要的是一致的,但我真的不喜欢使用计数器。我一个人怎么能用spark呢


谢谢

如果这是有效的,那么最好将其发布到

作为一个练习,我在没有计数器的情况下完成了这项工作,但在很大程度上,您只是在复制相同的功能

  • 计算每次出现的(
    cat
    术语
  • 分组依据
    cat
  • 根据计数对值进行排序,并根据术语的数量进行切片(
    2
代码:

输出:

[(1, ['orange', 'potato']), (2, ['vodka', 'beer'])]

如果这是工作,它可能是更好的张贴到

作为一个练习,我在没有计数器的情况下完成了这项工作,但在很大程度上,您只是在复制相同的功能

  • 计算每次出现的(
    cat
    术语
  • 分组依据
    cat
  • 根据计数对值进行排序,并根据术语的数量进行切片(
    2
代码:

输出:

[(1, ['orange', 'potato']), (2, ['vodka', 'beer'])]

美好的在mapValues之前,我一直都是这样的,但我无法理解。谢谢跟踪脚手架结构,将数据提取出来,这可能是一个挑战。在mapValues之前,我一直都是这样的,但我无法理解。谢谢跟踪脚手架结构,将数据提取出来可能是一项挑战。