MapReduce Crashed SQL

题目描述:

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()));
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值