1.map和reduce
MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。每个节点都以键值对作为输入和输出,其类型由程序员来选择。程序员还需要编写两个函数:map函数和reduce函数。
map阶段的输入时NCDC原始数据。我们选择文本格式作为输入格式,将数据集的每一行作为文本输入。键是某一行起始位置相对于文本起始位置的偏移量,不过我们不需要这个信息,所以将其忽略。
我们的map函数很简单。由于我们只对年份和气温属性感兴趣,所以只需要取出这两个字段数据。在本例中,map函数只是一个数据准备阶段,通过这种方式来准备数据,使reducer函数能够继续对它进行处理:即找出每年的最高气温。map函数韩式一个比较适合去除已损记录的地方:此处,我们筛掉缺失的,可疑的或者错误的气温数据。
为了全面了解mao的工作方式,我们考虑以下输入数据的示例数据:
0067011990999991950051507004...9999999N9+00001+9999999999...
0043011990999991950051512004...9999999N9+00221+9999999999...
0043011990999991950051518004...9999999N9-00111+9999999999...
这些行以键值对的方式作为map函数的输入:
(0,0067011990999991950051507004...9999999N9+00001+9999999999...)
(106,0043011990999991950051512004...9999999N9+00221+9999999999...)
(212,0043011990999991950051518004...9999999N9-00111+9999999999...)
键(key)是文件中的行偏移量,map函数并不需要这个信息,所以将其忽略。map函数的功能仅限于提取年份和气温信息(以粗体显示),并将它们作为
输出(气温值已用整数表示):
(1950,0)
(1950,22)
(1950,-11)
(1949,111)
(1949,78)
map函数的输出经由MapReduce框架处理后,最后发送到reduce函数。这个处理过程基于键来对键值对进行排序和分组。因此,在这一示例中,reduce函数看到的是如下输入:
(1949,[111,78])
(1950,[0,22,-11])
每一年份后紧跟着一系列气温数据。reduce函数现在要做的是遍历整个列表从中找出最大的读数:
(1949,111)
(1950,22)
这是最终输出结果:每一年的全球最高气温记录。