先放上代码:
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”。
最后做汇总统计,算出每个单词出现的总次数。