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

时间:2018-03-29 15:51:39

标签: pyspark

我有一个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 \
                 )

1 个答案:

答案 0 :(得分:0)

这是一种做法

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))]

如果不止一种类型具有相同的受欢迎程度,现在可以问一下最受欢迎的流派应该是什么?