• 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)

    结果:

     

  • 相关阅读:
    ORA-01045: user XXZY lacks CREATE SESSION privilege; logon denied
    ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05"
    HTTP 错误 401.3
    mysql 简单游标
    mysql 多重游标嵌套
    表单校验 “灰白字提示”
    Eclipse连接mysql数据库出现问题
    虚拟机无法使用桥接,没有未桥接网络适配器解决办法
    每周进度条(16)
    人月神话阅读笔记06
  • 原文地址:https://www.cnblogs.com/yszd/p/9154037.html
Copyright © 2020-2023  润新知