从Hbase读入的数据,求每个学科的平均成绩,学科作为键,成绩作为列族,然后用Mapreduce 方法,Java API
时间: 2024-02-27 12:56:27 浏览: 65
求学生平均成绩MapReduce实例
好的,这是一个典型的MapReduce任务,可以按照以下步骤进行:
1. 编写Mapper类
Mapper类的作用是将Hbase中的数据读入,按照学科作为键,成绩作为值进行映射。代码如下:
```java
public class AvgScoreMapper extends TableMapper<Text, DoubleWritable> {
private Text subject = new Text();
private DoubleWritable score = new DoubleWritable();
public void map(ImmutableBytesWritable row, Result columns, Context context) throws IOException, InterruptedException {
// 从Hbase中读入学科和成绩
String subjectStr = Bytes.toString(columns.getValue(Bytes.toBytes("subject"), Bytes.toBytes("")));
double scoreValue = Double.parseDouble(Bytes.toString(columns.getValue(Bytes.toBytes("score"), Bytes.toBytes(""))));
// 将学科作为键,成绩作为值进行映射
subject.set(subjectStr);
score.set(scoreValue);
context.write(subject, score);
}
}
```
2. 编写Reducer类
Reducer类的作用是将Mapper输出的键值对进行聚合,计算每个学科的平均成绩。代码如下:
```java
public class AvgScoreReducer extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
private DoubleWritable result = new DoubleWritable();
public void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
double sum = 0;
int count = 0;
// 对相同键的成绩进行累加和计数
for (DoubleWritable value : values) {
sum += value.get();
count++;
}
// 计算平均成绩
double avg = sum / count;
result.set(avg);
// 输出学科和平均成绩
context.write(key, result);
}
}
```
3. 编写Driver类
Driver类的作用是设置MapReduce任务的各种参数,并提交任务。代码如下:
```java
public class AvgScoreDriver {
public static void main(String[] args) throws Exception {
// 创建配置文件对象
Configuration conf = HBaseConfiguration.create();
// 设置Hbase表名
conf.set(TableInputFormat.INPUT_TABLE, "table_name");
// 创建Job对象
Job job = Job.getInstance(conf, "Avg Score");
// 设置Mapper类和输出键值对类型
job.setMapperClass(AvgScoreMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(DoubleWritable.class);
// 设置Reducer类和输出键值对类型
job.setReducerClass(AvgScoreReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
// 设置输入格式
job.setInputFormatClass(TableInputFormat.class);
// 设置输出格式
job.setOutputFormatClass(TextOutputFormat.class);
// 提交任务并等待完成
FileOutputFormat.setOutputPath(job, new Path(args[0]));
job.waitForCompletion(true);
}
}
```
其中,`table_name`是Hbase中的表名,`args[0]`是输出文件的路径。
4. 运行任务
将上述代码编译打包成jar包,并在命令行中执行以下命令:
```
hadoop jar avg-score.jar AvgScoreDriver /output/path
```
其中,`avg-score.jar`是打包好的jar包,`/output/path`是输出文件的路径。
这样就可以完成从Hbase读入数据,求每个学科的平均成绩的任务了。
阅读全文