题目:给一个大文件,文件里面存放若干个值,求所有数值里面的最大值和最小值,Java 写出 Hadoop 程序。
时间: 2024-03-21 15:44:33 浏览: 198
hadoop学习笔记(六)
好的,可以使用 MapReduce 框架来实现。
首先,需要编写 Mapper 类来读取大文件中的数据,将其输出为键值对。键为 NullWritable,值为 IntWritable,表示每一个数值。
```java
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Mapper;
public class MaxMinMapper extends Mapper<Object, Text, NullWritable, IntWritable> {
private IntWritable num = new IntWritable();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
num.set(Integer.parseInt(line));
context.write(NullWritable.get(), num);
}
}
```
然后,需要编写 Reducer 类来计算最大值和最小值。在 Reducer 类的 reduce() 方法中,将所有数值进行比较,并输出最大值和最小值。
```java
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Reducer;
public class MaxMinReducer extends Reducer<NullWritable, IntWritable, NullWritable, IntWritable> {
private IntWritable max = new IntWritable(Integer.MIN_VALUE);
private IntWritable min = new IntWritable(Integer.MAX_VALUE);
public void reduce(NullWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
for (IntWritable val : values) {
if (val.get() > max.get()) {
max.set(val.get());
}
if (val.get() < min.get()) {
min.set(val.get());
}
}
context.write(NullWritable.get(), max);
context.write(NullWritable.get(), min);
}
}
```
最后,需要编写 Driver 类来设置 MapReduce 作业的输入、输出路径和使用的 Mapper、Reducer 类等信息。
```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class MaxMinDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "MaxMin");
job.setJarByClass(MaxMinDriver.class);
job.setMapperClass(MaxMinMapper.class);
job.setReducerClass(MaxMinReducer.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
在命令行中运行程序:
```bash
hadoop jar MaxMin.jar MaxMinDriver input output
```
其中,MaxMin.jar 是打包后的程序包,input 是输入文件的路径,output 是输出结果的路径。
程序运行后,可以在输出路径下找到结果文件,其中记录了所有数值的最大值和最小值。
阅读全文