关于对hadoop中mapreduce的理解和自己用python实现底层逻辑的代码笔记

先放上代码:

def importFiles(filepath,filename):
    dataArr = []
    with open(filepath+filename) as file:
        for line in file:
            tmparr = line.rstrip('\n').split(' ')
            dataArr.append(tmparr)
    file.close()
    return dataArr

def map_func(data):
    #遍历数组元素,拆解成kv对,每个元素出现一次标上对应的1
    """"{'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'java': 1}
    {'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'kafka': 1}
    {'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'spark': 1}
    {'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'java': 1}
    """
    dict1={}
    dict1Arr=[]
    for line in data:
        dict1={}
        for col in line:
            dict1[col] = 1
        dict1Arr.append(dict1)

    #将每个元素kv对再汇聚成k2v2对,将1收集起来,有多少个1表示出现过多少次
    #{'hadoop': [1, 1, 1, 1], 'hive': [1, 1, 1, 1], 'mapreduce': [1, 1, 1, 1], 'java': [1, 1], 'kafka': [1], 'spark': [1]}
    dict2 = {}
    for line in dict1Arr:
        for col in line.keys():
            if col in dict2.keys():
                dict2[col].append(1)
            else:
                dict2[col] = [1]
    return dict2

def reduce_func(kv_data):
    redRes = {}
    for k in kv_data.keys():
        tmpSum = sum(kv_data[k])
        redRes[k] = tmpSum
    return redRes

    #{'hadoop': 4, 'hive': 4, 'mapreduce': 4, 'java': 2, 'kafka': 1, 'spark': 1}

if __name__=='__main__':
    #调用文件导入函数,导入本地数据文件
    impData = importFiles(r'D:\pycharm\PyCharm 2019.3\code',r'\worddata.txt')
    #将导入并已做好了拆分的文本数据传入map函数生成key,value对
    mapData = map_func(impData)
    res = reduce_func(mapData)
    print(res)

mapreduce分为两个环节,一个是map,一个是reduce。map拆分由这里的map_func函数实现,reduce聚合统计由reduce_func来实现。这里也是演示hadoop中解释mapreduce的最经典案例wordcount指令的底层实现,实现代码用python。

这里将输入文件中的单词按分隔符拆开,然后为每一个单词都标一个“1”:

{'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'java': 1}

{'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'kafka': 1}

{'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'spark': 1}

{'hadoop': 1, 'hive': 1, 'mapreduce': 1, 'java': 1}

随后将标上“1”的单词做一次聚集,收集到每一个单词有多少个“1”。

最后做汇总统计,算出每个单词出现的总次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值