我运行一个仅映射作业(在 Hadoop 上)以对键值进行排序,因为据说“Hadoop 在发送到减速器之前自动对映射器发出的数据进行排序”。
输入文件
2013-04-15 835352
2013-04-16 846299
2013-04-17 828286
2013-04-18 747767
2013-04-19 807924
我认为 Map(second_cloumn, first_column) 应该对该文件进行排序,如 output1 所示。当我在本地机器上运行它时,它实际上是这样做的。但是当我在集群上运行它时,输出就像 output2 中显示的那样。
输出1文件
747767 2013-04-18
807924 2013-04-19
828286 2013-04-17
835352 2013-04-15
846299 2013-04-16
输出2文件
835352 2013-04-15
747767 2013-04-18
807924 2013-04-19
828286 2013-04-17
846299 2013-04-16
我怎样才能保证它总是像在输出中一样。我愿意接受按第二列排序的其他建议。
映射器
public class MapAccessTime1 extends Mapper<LongWritable, Text, IntWritable, Text> {
private IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
int val = 0;
StringTokenizer tokenizer = new StringTokenizer(line);
if (!line.startsWith("#")) {
if (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
}
if (tokenizer.hasMoreTokens()) {
val = Integer.parseInt(tokenizer.nextToken());
one = new IntWritable(val);
context.write(one, word);
}
}
}
}