已知数据如下: 7369,SMITH,CLERK,7902,1980-12-17,800,null,20 7499,ALLEN,SALESMAN,7698,1981-02-20,1600,300,30 7521,WARD,SALESMAN,7698,1981-02-22,1250,500,30 7566,JONES,MANAGER,7839,1981-04-02,2975,null,20 7654,MARTIN,SALESMAN,7698,1981-09-28,1250,1400,30 7698,BLAKE,MANAGER,7839,1981-05-01,2850,null,30 7782,CLARK,MANAGER,7839,1981-06-09,2450,null,10 7788,SCOTT,ANALYST,7566,1987-04-19,3000,null,20 7839,KING,PRESIDENT,null,1981-11-17,5000,null,10 7844,TURNER,SALESMAN,7698,1981-09-08,1500,0,30 7876,ADAMS,CLERK,7788,1987-05-23,1100,null,20 7900,JAMES,CLERK,7698,1981-12-03,950,null,30 7902,FORD,ANALYST,7566,1981-12-02,3000,null,20 7934,MILLER,CLERK,7782,1982-01-23,1300,null,10 使用mr程序统计每年入职的人数。 最终结果要求如下: 1. 格式如下: 年份:1980 人数:xxx 年份:1981 人数:xxx ....... 2. 两个分区: 0分区存储 入职年份<1982年的 1分区存储 入职年份>=1982年的
时间: 2023-07-27 15:14:11 浏览: 46
好的,你的问题是如何使用mr程序统计每年入职的人数。
首先,我们需要对给出的数据进行清洗和格式化,将其转换成mr程序可以处理的格式。然后,我们需要使用MapReduce的两个阶段来完成统计。具体步骤如下:
1. 清洗和格式化数据
我们可以使用一个脚本或工具来将给出的数据转换成mr程序可以处理的格式,比如将每一行数据转换成一个JSON对象。JSON对象的格式可以是这样的:
{
"empno": 7369,
"ename": "SMITH",
"job": "CLERK",
"mgr": 7902,
"hiredate": "1980-12-17",
"sal": 800,
"comm": null,
"deptno": 20
}
2. 第一个MapReduce阶段
在第一个MapReduce阶段,我们需要将每个员工的入职年份作为键,将1作为值,将数据划分到不同的分区中(入职年份<1982年的划分到0分区,入职年份>=1982年的划分到1分区)。这个阶段的Mapper和Reducer函数如下:
Mapper函数:
function map(emp) {
let year = emp.hiredate.substring(0, 4);
let partition = (year < '1982') ? 0 : 1;
emit(partition + '-' + year, 1);
}
Reducer函数:
function reduce(key, values) {
let sum = 0;
for (let value of values) {
sum += value;
}
emit(key, sum);
}
这个Mapper函数将每个员工的入职年份作为键,将1作为值,将数据划分到不同的分区中。同时,它还在键的前面加上了一个标识符,用来表示这个键所属的分区。Reducer函数将同一个键的值进行累加,得到每个入职年份的总人数。
3. 第二个MapReduce阶段
在第二个MapReduce阶段,我们需要将输出结果按照入职年份进行汇总。这个阶段的Mapper和Reducer函数如下:
Mapper函数:
function map(key, value) {
let parts = key.split('-');
let partition = parts[0];
let year = parts[1];
emit(year, { partition: partition, value: value });
}
Reducer函数:
function reduce(key, values) {
let count0 = 0;
let count1 = 0;
for (let value of values) {
if (value.partition === '0') {
count0 += value.value;
} else {
count1 += value.value;
}
}
emit(key, { count0: count0, count1: count1 });
}
这个Mapper函数将每个键分解成分区和入职年份两个部分,并将其作为键。值是一个对象,包含了该入职年份在0分区和1分区的人数。Reducer函数将同一个入职年份的对象进行合并,得到该年份的总人数。
最终输出的结果应该是这样的:
年份:1980 人数:1
年份:1981 人数:10
年份:1982 人数:1
注意,这里我们只是展示了输出结果的格式,实际上输出的格式可以根据需求进行调整。