Python使用map,reduce高階函數模擬實現Spark的reduceByKey算子功能


# 使用默認的高階函數map和reduce

import random
def map_function(arg):  # 生成測試數據
  return (arg,1)
  list_map = list(map(map_function,list(ran * random.randint(1,2) for ran in list(range(10)))))
  list_map.append((0,1)) # 保持一定有相同的key
print("---原數據---")
print(list_map)
# 實現原理:在第一次調用該函數時根據key是否相同,覺得value是否相加,不管相加與否,都封裝成list保存到參數1中
# 之后的調用都先遍歷參數1,有匹配則value相加然后覆蓋到原list中,不管匹配與否,都重新賦值到參數1中
# 一直到最后返回最終結果
def reduce_by_key(arg1,arg2):
  if isinstance(arg1,(tuple)):
    if arg1[0] == arg2[0]: # 首次調用且key一樣時使用
      return [(arg1[0],arg1[1]+arg2[1])]
    else: # 首次調用且key不一樣時使用
      return [arg1,arg2]
  else:
    bool = 1 # 標記是否匹配
    for list_one in arg1:
      if list_one[0] == arg2[0]:
        arg1[arg1.index(list_one)] = (list_one[0],list_one[1]+arg2[1]) # key相同時value相加
        bool = 0
        break # 每次最多有一個key相同
    if bool: # 不匹配,添加
      arg1.append(arg2)
    return arg1
from functools import reduce
result = reduce(reduce_by_key,list_map)
print("---reduce_by_key后的結果---")
print(result)

結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM