如何使用纯RDD API合并相同键的RDD键值对?
问题
给定输入RDD如下:
RDD_Input = [(('377', '80'), ('1', '4')), (('377', '510'), ('1', '5')), (('377', '79'), ('1', '4')), (('377', '791'), ('1', '1')), (('377', '511'), ('1', '4')), (('377', '433'), ('1', '3')), (('377', '687'), ('1', '1')), (('377', '456'), ('1', '1')), (('377', '399'), ('1', '4')), (('377', '96'), ('1', '5')), (('377', '780'), ('1', '1')), (('377', '683'), ('1', '1')), (('377', '403'), ('1', '5')), (('377', '999'), ('1', '4')), (('377', '502'), ('1', '4')), (('377', '435'), ('1', '5')), (('377', '550'), ('1', '5')), (('377', '948'), ('1', '1')), (('377', '393'), ('1', '4')), (('377', '648'), ('1', '4'))]
该RDD的元素为键值对((movie1, movie2), (rating1, rating2)),需要将其转换为((movie1, movie2), (rating1, rating2), (rating3, rating4), ...)的格式——相同键对应的所有值元组依次追加到键之后。例如,若某个键对应两个值元组,结果应为(('377', '399'), ('1', '4'), ('1', '4'))。要求仅使用纯RDD API实现。
解决方案
可以通过groupByKey配合map操作完成转换,具体代码如下:
# 初始化RDD(假设已存在SparkContext实例sc) rdd = sc.parallelize(RDD_Input) # 核心转换逻辑 result_rdd = rdd.groupByKey().map(lambda item: (item[0],) + tuple(item[1])) # 打印结果示例 for elem in result_rdd.collect(): print(elem)
逻辑说明
- groupByKey:按照键
(movie1, movie2)分组,将相同键对应的所有(rating1, rating2)值聚合为一个可迭代对象; - map转换:将分组后的结果重新构造为目标格式——把键作为第一个元素,再将聚合的所有值元组依次拼接在后面,通过
(item[0],)将键转为单元素元组,再与tuple(item[1])(将可迭代的聚合值转为元组)拼接,最终得到符合要求的结构。
内容的提问来源于stack exchange,提问作者xxx
相关产品推荐
相关产品推荐

