我是hadoop新手,我的要求是只需要处理每个输入文件的前10行。以及如何在读取每个文件的10行之后退出mapper。如果有人能提供一些示例代码,这将是很大的帮助。提前谢谢。
92vpleto1#
您可以重写Map器的run方法,一旦您将map循环迭代10次,就可以中断while循环。这将假定您的文件不可拆分,否则您将从每个拆分中获得前10行:
@Override public void run(Context context) throws IOException, InterruptedException { setup(context); int rows = 0; while (context.nextKeyValue()) { if (rows++ == 10) { break; } map(context.getCurrentKey(), context.getCurrentValue(), context); } cleanup(context); }
pvabu6sv2#
假设n=10,那么我们可以使用下面的代码从下面的文件中只读取10条记录,如下所示:第1行线路2...第20行
//mapper class Mapcls extends Mapper<LongWritable, Text, Text, NullWritable> { public void run(Context con) throws IOException, InterruptedException { setup(con); int rows = 0; while(con.nextKeyValue()) { if(rows++ == 10) { break; } map(con.getCurrentKey(), con.getCurrentValue(), con); } cleanup(con); } public void map(LongWritable key, Text value, Context con) throws IOException, InterruptedException { con.write(value, NullWritable.get()); } } //driver public class Testjob extends Configured implements Tool { @Override public int run(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = new Job(conf, "Test-job"); job.setJobName("tst001"); job.setJarByClass(getClass()); job.setMapperClass(Mapcls.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(NullWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { int rc = ToolRunner.run(new Configuration(), new Testjob(), args); System.exit(rc); } }
然后输出为:第1行第10行线路2第3行第4行第5行第6行第7行第8行第9行
2条答案
按热度按时间92vpleto1#
您可以重写Map器的run方法,一旦您将map循环迭代10次,就可以中断while循环。这将假定您的文件不可拆分,否则您将从每个拆分中获得前10行:
pvabu6sv2#
假设n=10,那么我们可以使用下面的代码从下面的文件中只读取10条记录,如下所示:
第1行
线路2
.
.
.
第20行
然后输出为:
第1行
第10行
线路2
第3行
第4行
第5行
第6行
第7行
第8行
第9行