reducejoin

public class TableBean implements Writable{
        //封装对应字段
        private String order_id;
        private String pid;
        private int amount;
        private String pname;
        private String flag;

        pubic TableBean(){}

        setter;
        getter;

        public void write(DataOutput out) throws IOException{
            out.writeUTF(order_id);
            out.writeUTF(pid);
            out.writeInt(amount);
            out.writeUTF(pname);
            out.writeUTF(flag);
        }

        public void readFields(DataInput in) throws IOException{
            order_id = in.readUTF();
            pid = in.readUTF();
            amount = in.readInt();
            pname = in.readUTF();
            flag = in.readUTF();
            
        }
        public String toString(){
            return order_i+"\t+panme+"\t+amount
        }
    }

    public class TableMapper extends Mapper<LongWritable, Text, Text, TableBean>{
        pubic void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptException{
            TableBean v =new TableBean();
            Text k = new Text();

            //区分两张表
            FileSplit inputsplit = (FileSplit)context.getInputSplit();
            String name = inputsplit.getPath().getName();//得到全路径名

            //获取数据
            String line = value.toString();

            //区分 此时是订单表
            if(name.contains("order.txt")){
                //切分字段
                String[] fields = line.split("\t");

                //封装对象
                v.setOrder_id(fields[0]);
                v.setPid(fields[1]);
                v.setAmount(Integer.parseInt(fields[2]));
                v.setPname("");
                v.setFlag("0");

                //设置k 商品id
                k.set(fields[1]);

            }else{//此时是商品表
                //切分字段
                String[] fields = line.split("\t");

                //封装对象
                v.setOrder_id("");
                v.setPid(fields[0]);
                v.setAmount(0);
                v.setPname(fields[1]);
                v.setFlag("1");

                //设置k
                k.set(fields[0]);
            }

            context.write(k,v);

        }

    }

    pubic class TableReducer extends Reducer<Text, TableBean, TableBean, NullWritable>{
        public void reduce(Text key, Interable<Table> value, Context context)
                throws Exception{
            //创建集合 存放订单数据
            ArrayList<TableBean> orderBean = new ArrayList<>();

            //商品存储
            TableBean pdBean = new TableBean();//把pd中商品名拷贝到orderBean

            for(TableBean v : value){
                if("0".equals(v.getFlag())){
                    //订单表
                    //1、创建一个临时变量拷贝数据
                    TableBean tableBean = new TableBean();

                    //2、拷贝
                    BeanUtils.copyProperties(tableBean, v);

                    orderBean.add(tableBean);

                }else{
                    //商品表
                    BeanUtils.copyProperties(pdBean, v);

                }
            }
            //拼接表
            for(TableBean tableBean : orderBean){
                //加入商品名
                tableBean.setpanem(pdBean.getPname());
                context.write(tableBean, NullWritable.get());
            }

        }
    }
    public class FileDriver{
        public static void main(String[] args) throws IOException, ClassNotFoundException,InterruptException{
            Configuration conf = new Configuration();
            Job job = Job.getInstance();

            job.setJarByClass(FileDriver.class);

            job.setMapperClass(TableMapper.class);
            job.setReducerClass(TableReducer.class);

            job.setMapOutputValueClass(TableBean.class);
            job.setMapOutputKeyClass(Text.class);

            job.setOutputKeyClass(TableBean.class);
            job.setOutputValueClass(NullWritable.class);

            FileInputFormat.setInputPaths(job, new Path("C:/in"));
            FileOutputFormat.setOutputPath(job, new Path("c:/out"));

            job.waitForCompletion(true);
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值