我正在使用hadoop map reduce,我想计算两个文件。我的第一次map/reduce迭代是给我一个文件,文件的id号是这样的:
A 30
D 20
我的目标是使用文件中的id与另一个文件关联,并有另一个带有三个id的输出:id、编号、名称,如下所示:
A ABC 30
D EFGH 20
但我不确定使用map reduce是否是最好的方法。例如,使用文件读取器读取第二个输入文件并通过id获取名称会更好吗?或者我可以用map reduce吗?
如果是的话,我想知道怎么做。我尝试了多输入解决方案:
MultipleInputs.addInputPath(job2, new Path(args[1]+"-tmp"),
TextInputFormat.class, FlightsByCarrierMapper2.class);
MultipleInputs.addInputPath(job2, new Path("inputplanes"),
TextInputFormat.class, FlightsModeMapper.class);
但我想不出任何办法来将两者结合起来,得到我想要的结果。我现在的方法就是给我这样一个例子:
A ABC
A 30
B ABCD
C ABCDEF
D EFGH
D 20
在我最后一次降价之后,我得到了这样一个结果:
N125DL 767-332
N125DL 7 ,
N126AT 737-76N
N126AT 19 ,
N126DL 767-332
N126DL 1 ,
N127DL 767-332
N127DL 7 ,
N128DL 767-332
N128DL 3
我要这个:n127dl 7 767-332。而且,我不想要那些不结合的。
这是我的课程:
公共舱航班ByCarrierReducer2{
String merge = "";
protected void reduce(Text token, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
int i = 0;
for(Text value:values)
{
if(i == 0){
merge = value.toString()+",";
}
else{
merge += value.toString();
}
i++;
}
context.write(token, new Text(merge));
}
}
更新:
http://stat-computing.org/dataexpo/2009/the-data.html 这就是我正在使用的例子。
我正在尝试:tailnum和cancelled,它是(1或0)获取对应于tailnum的模型名。我和模特的档案里有一个尾号,模特和其他东西。我的电流输出是:
n193jb erj 190-100 igw系列
n194dn 767-332型
n19503 emb-135er型
n19554 emb-145lr
n195dn 767-332型
n195dn 2型
首先是钥匙,其次是模型,取消航班的钥匙出现在模型下面
我想要一个三键,取消的型号,因为我想要每个型号的取消数量
2条答案
按热度按时间s6fujrry1#
您可以使用id作为两个Map器的键来连接它们。你可以这样写你的Map任务
我想你可以恢复同样的Map任务。然后编写一个CommonReducer作业,其中hadoop框架按键对数据进行分组。这样你就可以把id作为密钥了。可以缓存其中一个值,然后concat。
最后,您可以编写驱动程序类
你可以在这里找到这个例子
希望这有帮助。
更新
输入1
输入2
输出
Map器.java
减速器.java
驾驶员等级
bgtovc5b2#
您的reducer有一个map方法,但它应该有一个reduce方法,该方法接受一个iterable值集合,然后合并这些值。因为没有reduce()方法,所以得到的默认行为是只传递所有键/值对。