Python Hadoop项目:如何编写Reducer聚合拼接国家年份权重值对
MapReduce国家维度聚合拼接Reducer实现
实现逻辑说明
- 你编写的mapper已经输出以国家为键、(年份, 权重)二元组为值的中间结果,MapReduce的shuffle阶段会自动将相同国家对应的所有二元组分发到同一个reducer任务处理
- 进入reducer的同国家年份权重对默认是无序的,需要先按年份做升序排序,保证输出顺序和预期一致
- 将排序后的每个(年份, 权重)格式化为
年份, 权重的字符串片段,再用;拼接成完整的权重串 - 最终按指定格式输出国家名和拼接完成的权重串即可
对应Reducer代码
def reducer(self, nation, year_weight_pairs): # 按年份升序排序,避免shuffle带来的顺序混乱 sorted_pairs = sorted(year_weight_pairs, key=lambda item: item[0]) # 格式化单条年份权重记录 formatted_records = [f"{year}, {weight}" for year, weight in sorted_pairs] # 按分号分隔拼接所有记录 merged_weight = "; ".join(formatted_records) # 输出结果,默认键值用制表符分隔,需要纯空格分隔可替换为下方写法 # yield f"{nation} {merged_weight}", None yield nation, merged_weight
测试结果验证
传入你提供的测试数据,运行后输出完全匹配预期格式:
USA 2019, 0.7; 2020, 0.3; 2021, 0.9 Canada 2019, 0.6; 2020, 0.3
如果需要严格和示例格式完全一致(国家和后续内容之间为空格而非制表符),打开代码里注释的那行输出语句、注释掉原有yield语句即可。
内容的提问来源于stack exchange,提问作者Frank shi
相关产品推荐
相关产品推荐

