按部门名称列出的女员工代码

yjghlzjz  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(335)

我是Map编码新手。我请求帮助编写减速机代码,按部门名称查找女员工的数量。
我有两个结构化数据文件。一个给员工,另一个给部门。在员工档案中,我有“empid”、“empname”、“empgender”、“empdeptid”和“empalary”。在第二个部门文件中,我有“depid”和“deptname”。现在我想通过每个部门的名字找出女性员工的数量。
我已经编写了一个empmapper,其中返回的键为deptid(intwritable),返回的出现次数为value,即迭代次数(作为文本)。例如

(1,[1])
(2,[1])
(3,[1])
(4,[1])
(1,[1])

在洗牌和排序阶段之后,输出如下:

(1,[1,1])
(2,[1])
(3,[1])
(4,[1])

同样从deptmapper返回以下输出(key作为deptid(intwritable)和deptname(作为text)作为value):

(1,[IT])
(2,[Comsc])
(3,[Electrical])
(4,[Mechanical])

现在我担心的是我不能正确地写减速机。我想把减速机的输出作为

(IT,2)
(Comsc,1)
(Electrical,1)
(Mechanical,1)

请帮助我在减速机代码(其中一种连接是必需的)。

j8ag8udp

j8ag8udp1#

减速机的key=intwritable,value=text。因此,您可以轻松地将它们连接在一起,但是当您获得计数时,我会发现您对类型的问题(例如,“1”、“1”以及部门名称“it”)。
一个简单的方法就是检查文本是否是int,如果遇到解析错误,可以假设它是您的部门名称。
也许下面的代码(尽管有黑客攻击)可以帮助您找到解决方案:

@Override
protected void reduce(Text key, Iterable<Text> values, Context context)
        throws IOException, InterruptedException {

    String departmentName = null;
    int sum = 0;
    for (Text value : values) {
        String unknown = value.toString();
        try {
            int valueCount = Integer.parseInt(unknown);
            sum += valueCount;
        } catch (NumberFormatException e) {
            departmentName = unknown;
        }
    }

    assert departmentName != null;

    context.write(new Text(departmentName), new IntWritable(sum));
}

我不喜欢在流控制中使用异常,但是让我们务实一点。
小工作改进:
通过使用 MultipleInputs 班级
将department id作为键,count+department name作为值
以上是否减少

f45qwnt8

f45qwnt82#

它基本上是一个reduce-side连接,在reduce-side中创建一个部门图,并为每个员工使用这个图获得每个员工的部门,然后使用一个单独的数据结构进行统计。

kzipqqlq

kzipqqlq3#

在mapreduce中编写连接很麻烦。如果您已经有了结构化(关系)数据,那么考虑使用hive这样的高级框架来编写sql查询可能是有意义的。
如果你想使用mapreduce,看看这篇文章的reduce-side-joins和这篇文章的map-side-joins。

相关问题