题目描述:
DASE店铺在开业一周年之际,决定通过以下活动来回馈新老用户,即在过去一年内订单金额前5的订单可以享受八折优惠。Tom是一名SQL开发人员,他为了从历史订单表中找出总金额前五的订单,很轻松地就写出了相应的SQL语句 SELECT id,UserName,SUM(Price) total FROM orders ORDER BY total DESC LIMIT 5; 但海量的订单导致该SQL查询在单机数据库中执行一段时间后就崩溃而无法得到结果,Tom只好求助作为大数据开发工程师的你,希望你能帮他实现该SQL语句的功能。 请你通过MapReduce程序来实现上述SQL语句的功能。
输入格式:每行表示一条订单记录,第一列到最后一列分别表示订单Id,用户名,购买产品,单价(int),购买数量(int),订单日期,每列之间用制表符分隔。
Id UserName Product Price Number Date
u00001 rookie 文化衫 45 20 2021-6-11
u00003 lucy 贺卡 15 35 2021-9-08
u00027 wang 钢笔 27 10 2021-3-22
u00102 anni 鼠标 108 1 2021-5-27
u00004 lucy 水杯 98 1 2021-11-09
u00005 rookie 教材 40 2 2021-9-01
u00019 lucy 文化衫 45 4 2021-10-03
u00110 song 教材 55 1 2021-9-01
u00111 shy 教材 35 1 2021-9-02
u00311 shy 本子 20 2 2021-9-02
输出格式: 请输出订单Id,UserName,total,每列之间用制表符分隔
u00001 rookie 900
u00003 lucy 525
u00027 wang 270
u00019 lucy 180
u00102 anni 108
在DSPPCode.mapreduce.crashed_sql.impl中创建SQLMapperImpl,继承SQLMapper,实现抽象方法;在DSPPCode.mapreduce.crashed_sql.impl中创建SQLReducerImpl,继承SQLReducer,实现抽象方法。
2、代码
SQLMapperImpl.java
package DSPPCode.mapreduce.crashed_sql.impl;
import DSPPCode.mapreduce.crashed_sql.impl.SQLReducerImpl.Info;
import DSPPCode.mapreduce.crashed_sql.question.SQLMapper;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class SQLMapperImpl extends SQLMapper {
class Info {
private String key;
private long value;
public Info(String key, long value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public long getValue() {
return value;
}
}
public List<Info> Array = new ArrayList<>();
@Override
public void map(Object key, Text value, Mapper<Object, Text, Text, LongWritable>.Context context)
throws IOException, InterruptedException {
String[] list=value.toString().split("\t");
String Index=list[0]+"\t"+list[1];
long sum=Long.parseLong(list[3])*Long.parseLong(list[4]);
Array.add(new Info(Index, sum));
Array.sort(Comparator.comparing(Info::getValue).reversed()); //降序排列
// System.out.println(Array.size());
Array.sort(Comparator.comparing(Info::getValue).reversed());
if (Array.size() > 5) {
Array.remove(5);
}
}
public void cleanup(Context context)
throws IOException, InterruptedException {
// int count=0;
for (Info data : Array) {
context.write(new Text(data.getKey()), new LongWritable(data.getValue()));
// count=count+1;
// // System.out.println(count);
// if (count>=5) {
// break;
// }
}
}
}
SQLReducerImpl.java
package DSPPCode.mapreduce.crashed_sql.impl;
import DSPPCode.mapreduce.crashed_sql.question.SQLReducer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class SQLReducerImpl extends SQLReducer {
class Info {
private String key;
private long value;
public Info(String key, long value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public long getValue() {
return value;
}
}
public List<Info> Array = new ArrayList<>();
public void reduce(Text key, Iterable<LongWritable> values, Reducer<Text, LongWritable, Text, LongWritable>.Context context)
throws IOException, InterruptedException{
for (LongWritable value : values) {
Array.add(new Info(key.toString(), value.get()));
Array.sort(Comparator.comparing(Info::getValue).reversed());
if (Array.size() > 5) {
Array.remove(5);
}
}
}
public void cleanup(Context context)
throws IOException, InterruptedException {
// System.out.println("?????");
// System.out.println(Array.size());
// int count=0;
for (Info data : Array) {
context.write(new Text(data.getKey()), new LongWritable(data.getValue()));
}
}
}