You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用纯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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:05:26