Pyspark 如何按键对RDD进行分组,然后按唯一字符串计数?

Pyspark 如何按键对RDD进行分组,然后按唯一字符串计数?,pyspark,Pyspark,我有一个RDD,比如: [(1, "Western"), (1, "Western") (1, "Drama") (2, "Western") (2, "Romance") (2, "Romance")] 我希望计算每个用户ID的每种电影类型的发生率,从而产生 1, { "Western", 2), ("Drama", 1) } ... 之后,我打算选择数量最多的一种,从而获得每个用户最受欢迎的流派 我尝试了userGenre.sortByKey().countByValue() 但毫无用

我有一个RDD,比如:

[(1, "Western"),
(1, "Western")
(1, "Drama")
(2, "Western")
(2, "Romance")
(2, "Romance")]
我希望计算每个用户ID的每种电影类型的发生率,从而产生

1, { "Western", 2), ("Drama", 1) } ... 
之后,我打算选择数量最多的一种,从而获得每个用户最受欢迎的流派

我尝试了
userGenre.sortByKey().countByValue()
但毫无用处,我对如何完成这项任务一无所知。我用的是pyspark jupyter笔记本

编辑:

我尝试了以下方法,但似乎有效,有人能证实吗

userGenreRDD.map(lambda x: (x, 1)).aggregateByKey(\
                  0, # initial value for an accumulator \
                  lambda r, v: r + v, # function that adds a value to an accumulator \
                  lambda r1, r2: r1 + r2 # function that merges/combines two accumulators \
                 )

这里有一种方法

rdd = sc.parallelize([('u1', "Western"),('u2', "Western"),('u1', "Drama"),('u1', "Western"),('u2', "Romance"),('u2', "Romance")])
每种电影类型的出现可能是不同的

>>> rdd = sc.parallelize(rdd.countByValue().items())
>>> rdd.map(lambda ((x,y),z): (x,(y,z))).groupByKey().map(lambda (x,y): (x, [y for y in y])).collect()
[('u1', [('Western', 2), ('Drama', 1)]), ('u2', [('Western', 1), ('Romance', 2)])]
最受欢迎的流派

>>> rdd.map(lambda (x,y): ((x,y),1)).reduceByKey(lambda x,y: x+y).map(lambda ((x,y),z):(x,(y,z))).groupByKey().mapValues(lambda (x,y): (y)).collect()
[('u1', ('Western', 2)), ('u2', ('Romance', 2))]
现在有人可能会问,如果一个以上的体裁拥有相同的受欢迎程度,那么什么应该是最受欢迎的体裁