我有一个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 \
)
答案 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))]
如果不止一种类型具有相同的受欢迎程度,现在可以问一下最受欢迎的流派应该是什么?