如何基于RDD的category列获取各分类Top5统计结果(仅用RDD实现)
用RDD实现按分类分组取Top5统计结果
解决方案思路
要实现按category分组并获取各分类下的Top5(按count降序),可以通过以下RDD操作步骤完成:
- 转换键值对结构:将原RDD转换为以
category为key,包含id、title、count的元组为value的键值对RDD。 - 按分类分组:使用
groupByKey()对转换后的RDD按分类分组。 - 组内排序取TopN:对每个分组内的元素,按
count降序排序后截取前5个元素(若分组内元素不足5个则保留全部)。
具体代码实现(PySpark)
from pyspark import SparkContext sc = SparkContext("local", "CategoryTop5") # 初始化用户提供的RDD数据 rdd_data = [ ('B000002KXA', 'Music', 'Rescue Me', 1), ('6302049040', 'Movies & TV', 'Pennies from Heaven [VHS]', 2), ('B000002OKC', 'Music', 'Country Music Hall of Fame', 1), ('6304174616', 'Movies & TV', 'Star Blazers Series 1: The Quest for Iscandar (6pc) (Coll) [VHS]', 1), ('630265288X', 'Movies & TV', 'The Kathy Kaehler Fitness System [VHS]', 1), ('B000002H3Z', 'Music', 'London 0 Hull 4', 3), ('6304071841', 'Movies & TV', 'Romeo & Juliet [VHS]', 2), ('0790732475', 'Movies & TV', 'Batman & Robin [VHS]', 1), ('0471178411', 'Books', 'Microsoft Exchange 5 Sourcebook', 2), ('6300271765', 'Movies & TV', 'Sphinx [VHS]', 1) ] rdd = sc.parallelize(rdd_data) # 步骤1:转换为(category, (id, title, count))的键值对RDD keyed_rdd = rdd.map(lambda x: (x[1], (x[0], x[2], x[3]))) # 步骤2+3:分组后对每个组内元素按count降序排序,取前5 category_top5 = keyed_rdd.groupByKey().mapValues( lambda items: sorted(items, key=lambda x: -x[2])[:5] ) # 打印结果 for category, top_items in category_top5.collect(): print(f"分类: {category}") for idx, item in enumerate(top_items, 1): print(f" Top{idx}: ID={item[0]}, 标题={item[1]}, 统计数={item[2]}") print("---")
代码说明
- 键值对转换:
map(lambda x: (x[1], (x[0], x[2], x[3])))把每个元素的category提取为key,其余字段打包成value,方便后续分组。 - 分组与排序:
groupByKey()按分类聚合后,mapValues()对每个分类下的元素进行处理——用sorted()按count的负值排序(实现降序),再通过[:5]截取前5个元素。 - 为什么不用
takeOrdered()?因为takeOrdered(n)是对整个RDD全局排序取前n个,无法实现分组后每个组内单独取TopN,所以之前的尝试无法达成目标。
运行结果示例
分类: Music Top1: ID=B000002H3Z, 标题=London 0 Hull 4, 统计数=3 Top2: ID=B000002KXA, 标题=Rescue Me, 统计数=1 Top3: ID=B000002OKC, 标题=Country Music Hall of Fame, 统计数=1 --- 分类: Movies & TV Top1: ID=6302049040, 标题=Pennies from Heaven [VHS], 统计数=2 Top2: ID=6304071841, 标题=Romeo & Juliet [VHS], 统计数=2 Top3: ID=6304174616, 标题=Star Blazers Series 1: The Quest for Iscandar (6pc) (Coll) [VHS], 统计数=1 Top4: ID=630265288X, 标题=The Kathy Kaehler Fitness System [VHS], 统计数=1 Top5: ID=0790732475, 标题=Batman & Robin [VHS], 统计数=1 --- 分类: Books Top1: ID=0471178411, 标题=Microsoft Exchange 5 Sourcebook, 统计数=2 ---
内容的提问来源于stack exchange,提问作者xxx
相关产品推荐
相关产品推荐

