mapreduce统计hbase成绩表中单科排名、总分排名的java代码
时间: 2023-08-31 08:35:42 浏览: 119
### 回答1:
这是一个使用 MapReduce 统计 HBase 成绩表中单科排名和总分排名的示例 Java 代码:
```
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
public class RankMapper extends TableMapper<Text, IntWritable> {
private static final byte[] CF = Bytes.toBytes("cf");
private static final byte[] SUBJECT_COL = Bytes.toBytes("subject");
private static final byte[] SCORE_COL = Bytes.toBytes("score");
private Text outputKey = new Text();
private IntWritable outputValue = new IntWritable();
@Override
public void map(ImmutableBytesWritable key, Result value, Context context)
throws IOException, InterruptedException {
// 读取行键(即学生 ID)
String studentId = Bytes.toString(key.get());
// 读取科目名称
String subject = Bytes.toString(value.getValue(CF, SUBJECT_COL));
// 读取分数
int score = Bytes.toInt(value.getValue(CF, SCORE_COL));
// 输出单科排名
outputKey.set(subject);
outputValue.set(score);
context.write(outputKey, outputValue);
// 输出总分排名
outputKey.set(studentId);
context.write(outputKey, outputValue);
}
}
```
在这段代码中,我们使用 HBase 的 `TableMapper` 类实现了一个 MapReduce 的 Mapper 类。在 Mapper 的 `map()` 方法中,我们读取了 HBase 中的行键(即学生 ID)、科目名称和分数。然后,我们使用 `context.write()` 方法输出两组键值对,分别用于统计单科排名和总分排名。
这仅是一个示例代码,实际应用
### 回答2:
下面是一个用Java编写的MapReduce程序的示例,用于统计HBase成绩表中单科排名和总分排名:
```java
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.mapreduce.*;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
public class ScoreRanking extends Configured implements Tool {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
int res = ToolRunner.run(conf, new ScoreRanking(), args);
System.exit(res);
}
public int run(String[] args) throws Exception {
Configuration conf = this.getConf();
Job job = Job.getInstance(conf, "Score Ranking");
job.setJarByClass(ScoreRanking.class);
Scan scan = new Scan();
TableMapReduceUtil.initTableMapperJob(
"成绩表",
scan,
ScoreMapper.class,
Text.class,
IntWritable.class,
job);
TableMapReduceUtil.initTableReducerJob(
"结果表",
ScoreReducer.class,
job);
return job.waitForCompletion(true) ? 0 : 1;
}
public static class ScoreMapper extends TableMapper<Text, IntWritable> {
private Text subject = new Text();
private IntWritable score = new IntWritable();
public void map(ImmutableBytesWritable row, Result value, Context context) throws IOException, InterruptedException {
String subjectName = Bytes.toString(row.get());
int studentScore = Bytes.toInt(value.getValue(Bytes.toBytes("成绩"), Bytes.toBytes("得分")));
subject.set(subjectName);
score.set(studentScore);
context.write(subject, score);
}
}
public static class ScoreReducer extends TableReducer<Text, IntWritable, ImmutableBytesWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int rank = 1;
for (IntWritable value : values) {
Put put = new Put(Bytes.toBytes(key.toString()));
put.addColumn(Bytes.toBytes("排名"), Bytes.toBytes(String.valueOf(rank)), Bytes.toBytes(value.get()));
context.write(null, put);
rank++;
}
}
}
}
```
这个MapReduce程序将从名为"成绩表"的HBase表中读取数据,每一行包含一个科目和一个得分。然后,对每个科目进行map操作,将科目作为键,得分作为值传递给Reducer。在Reducer中,对每个科目的得分进行排序,并将排名作为键,得分作为值写入名为"结果表"的HBase表中。
请根据您的需求调整HBase表和列族的名称,并将程序中的文件路径设置为适当的位置。
阅读全文