项目描述 这里有三个数据表,如表1、2和3所示。要求:(1)通过MapReduce,能将表格信息根据关联字段进行合并处理,结果如表4所示;(2)通过Hive Api创建表4结果对应的外部表;(3)创建一个Hive 自定义函数(如取名myfun),调用该UDF时,结果显示你的学号姓名为前缀,然后再接对应字段内容,如: select myfun(科目) from 表4 limit 1, 结果为: “101 liqiang计算机组成原理” 成绩表 表1 学号 科目 成绩 10013 BX001 90 10013 BX002 95 10015 XX010 88 10014 BX001 84 学生信息表 表2 学号 姓名 10013 张三 10014 李四 10015 王五 课程信息表 表3 课程号 课程名称 BX001 计算机组成原理 BX002 大学英语 XX010 云计算与大数据 最终输入结果 表4 姓名 科目 成绩 张三 计算机组成原理 90 张三 大学英语 95 王五 云计算与大数据 88 李四 计算机组成原理 84 给出Java代码我
时间: 2024-03-18 11:41:55 浏览: 115
GFS、MapReduce和BigTable:Google的三种大数据处理系统
好的,以下是Java代码的实现。
1. MapReduce合并表格
```
public class ScoreJoin {
public static class Map extends Mapper<LongWritable, Text, Text, Text> {
private Text outKey = new Text();
private Text outValue = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] fields = line.split("\t");
String studentId = fields[0];
String subject = fields[1];
String score = fields[2];
if (subject.startsWith("BX")) {
outKey.set(studentId);
outValue.set("score\t" + subject + "\t" + score);
context.write(outKey, outValue);
} else if (subject.startsWith("XX")) {
outKey.set(studentId);
outValue.set("course\t" + subject);
context.write(outKey, outValue);
} else {
outKey.set(studentId);
outValue.set("name\t" + subject);
context.write(outKey, outValue);
}
}
}
public static class Reduce extends Reducer<Text, Text, Text, Text> {
private Text outKey = new Text();
private Text outValue = new Text();
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
String name = null;
String course = null;
String score = null;
for (Text value : values) {
String[] fields = value.toString().split("\t");
if (fields[0].equals("name")) {
name = fields[1];
} else if (fields[0].equals("course")) {
course = fields[1];
} else {
score = fields[2];
}
}
if (name != null && course != null && score != null) {
outKey.set(name);
outValue.set(course + "\t" + score);
context.write(outKey, outValue);
}
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "score join");
job.setJarByClass(ScoreJoin.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
2. Hive Api创建外部表
```
CREATE EXTERNAL TABLE table4 (
name STRING,
course STRING,
score INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '/user/hive/warehouse/table4';
```
3. Hive自定义函数
```
public class MyFun extends UDF {
private String studentId = "101";
private String name = "liqiang";
public String evaluate(String subject) {
return studentId + " " + name + subject;
}
}
```
将以上代码编译打包成jar包,然后在Hive中执行以下语句即可完成UDF的注册:
```
ADD JAR /path/to/myfun.jar;
CREATE TEMPORARY FUNCTION myfun AS 'com.example.MyFun';
```
最后,可以使用类似以下的Hive查询语句来测试结果:
```
select myfun(course) from table4 limit 1;
```
查询结果应该是:
```
101 liqiang计算机组成原理
```
其中,101是你的学号,liqiang是你的姓名。
阅读全文