业务场景:
现有数据如下:
需求:统计每个单词在不同文件中分别出现的次数,输出如下格式:
hello a.html-->4 b.html-->4 c.html-->6
hello在a文件中出现4次,在b文件中出现4次,c文件中出现6次。。。
思路:
问题:分组条件必然是单词和文件名称,关键是怎么每次map和reduce该如何确定输入输出结果呢?
拓展:如果是用SQL来统计会不会容易些?于是根据每行数据在mySQL中造了如下数据
SQL统计:
SELECT t.word,group_concat(CONCAT(path,':',count)) result,sum(t.count) total
FROM(
SELECT word,path,count(1) count
FROM word
GROUP BY word,path) t
GROUP BY t.word
看的出来,用SQL统计的话很简单
SQL写出来后发现分两次查询,第一次分组查询的结果作为第二次的查询的来源
其中分两次GROUP BY,于是想到分两次mapReduce程序来聚合
第一次分组聚合:
SQL版本:
MapReduce:中间结果
* 第一步:输出结果:单词-文件名 次数 * hello-a.txt 2 * hello-b.txt 3
第二次分组聚合:
MapReduce:最终结果
* 第二步:最终输出结果 * hello a.txt:2; b.txt:3
这样确定思路后MapReduce代码就很简单,这里就不贴代码了