Apache spark 从PySpark RDD中的每个组中获取前N个元素(不使用groupByKey)

Apache spark 从PySpark RDD中的每个组中获取前N个元素(不使用groupByKey),apache-spark,pyspark,Apache Spark,Pyspark,我有一个RDD,如下所示 dataSource=sc.parallelize([(“用户1”,“3”,“蓝色”),(“用户1”,“4”,“黑色”),(“用户2”,“5”,“白色”),(“用户2”,“3”,“黑色”),(“用户2”,“6”,“红色”),(“用户1”,“1”,“红色”))) 我想使用reduceByKey查找每个用户的前2种颜色,以便输出RDD,如: sc.parallelize([(“用户1”,“黑色”,“蓝色]),(“用户2”,“红色”,“白色])])) 所以我需要按键进行缩

我有一个RDD,如下所示

dataSource=sc.parallelize([(“用户1”,“3”,“蓝色”),(“用户1”,“4”,“黑色”),(“用户2”,“5”,“白色”),(“用户2”,“3”,“黑色”),(“用户2”,“6”,“红色”),(“用户1”,“1”,“红色”)))
我想使用
reduceByKey
查找每个用户的前2种颜色,以便输出RDD,如:

sc.parallelize([(“用户1”,“黑色”,“蓝色]),(“用户2”,“红色”,“白色])]))
所以我需要按键进行缩减,然后对每个键的值进行排序,即(数字、颜色)按数字排序,并返回前n个颜色

我不想使用
groupBy
。如果除了
groupBy
,还有比
reduceByKey
更好的方法,那就太好了:)

例如,你可以使用一个。所需进口:

导入heapq
从functools导入部分
助手功能:

def零值(n):
“”“初始化队列。如果n较大
跟踪多个元素可能更有效
在heap(cnt,heap)上,并在heappush和heappushpop之间切换
如果我们超过n,我将此作为练习留给读者
范围(n)内的uu返回[(浮点(“-inf”),无]
定义顺序函数(附件x):
heapq.heappushpop(附件x)
返回acc
def合并功能(acc1、acc2、n):
返回heapq.nlargest(n,heapq.merge(acc1,acc2))
def最终确定(kvs):
如果k!=float(“-inf”),以kvs为单位返回[v(k,v)]
数据:

rdd=sc.parallelize([
(“用户1”,“3”,“蓝色”),(“用户1”,“4”,“黑色”),
(user2,(5,白色),(user2,(3,黑色),,
(“用户2”,(6,“红色”),(“用户1”,(1,“红色”)]))
解决方案:

(rdd
    .aggregateByKey(zero_value(2), seq_func, partial(merge_func, n=2))
    .mapValues(finalize)
    .collect())
结果:

[('user2',['red','white']),('user1',['black','blue'])]