如何使用从两个Map器到一个还原器的键和值?

t9aqgxwy  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(253)

我有两个不同的文件名为a.txt和b.txt。

A.txt:                    B.txt
id  name    des          id  name
1   one     0            1   apple   
2   two     1            2   pine  
3   three   0            3   orange

在这里,我在两个文件中都有相同的字段“id”。我用了两个mapper类。一个用于a.txt,另一个用于b.txt。有一个减速机类。

In MapperA.class "des" is checked and if "0" then its id is sent as key and value as name. 
In MapperB.class id and name is sent as key and value.
Now, in reducer I need to determine the "id" from MapperA and check with "id" from MapperB and if present, then send key as "id" and value as "name". 
How can we compare the key and value from two mapper in a reducer to get desired result?

减速器的期望输出为:

id      name
1       apple
3       orange
46qrfjad

46qrfjad1#

在reduce函数中不需要比较过程。对于每个输入a.txt和b.txt,将有2个单独的Map器类
a.txt的Map器如果(des==0)那么写id,value-->des>//des将是textwritable(“0”),否则不写任何东西
b.txt的Map器
id,值-->苹果或橘子或松树…>
减速机
输入将是<1,{0,apple}><2,{pine}><3,{0,orange}>
然后在还原过程中

Boolean shouldBeWritten=false;
foreach value
{
  char firstLetter = first char of value;
  if( firstletter == 0 )
   shouldBeWritten=true;
}
if(shouldBeWritten)
write(key, value);

在这个实现中,您还必须获得水果名的第一个字母,这是不高效的,但是您不必在第一个Map器中发送不必要的对。
这只是一个例子,决定权在你。
决定取决于a.txt和b.txt的大小。

相关问题