Hadoop-mapreduce reducer端多表合并

package cn.nyzc.reducejoin;


import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;


import org.apache.hadoop.io.Writable;


/**
 * 传输的bean对象
 * <p>Title: OrderBean</p>
 * <p>Description: </p>
 * <p>Company: www.xnlc.cn</p> 
 * @author 黄庭华
 * @date 2016年7月17日下午2:52:36
 * @version 1.0
 */
public class OrderBean implements Writable{

private String oid;//订单id
private String pid;//商品id
private  int amount;//订单中商品的数量
private String pname;//商品名称
private String flag;//标记符号 "0"代表订单表 "1"代表商品表


//输出到文件中的内容由tostring方法控制
@Override
public String toString() {
return oid + "\t" + pname +"\t"+ amount;
}

//方便order表对象存储
public void setOrder(String oid,String pid,int amount){
this.oid=oid;
this.pid=pid;
this.amount=amount;
this.pname="";
this.flag="0";
}

//方便pro表对象存储
public void setPro(String pid,String pname){
this.oid="";
this.pid=pid;
this.amount=0;
this.pname=pname;
this.flag="1";
}




public String getOid() {
return oid;
}


public void setOid(String oid) {
this.oid = oid;
}


public String getPid() {
return pid;
}


public void setPid(String pid) {
this.pid = pid;
}


public int getAmount() {
return amount;
}


public void setAmount(int amount) {
this.amount = amount;
}


public String getPname() {
return pname;
}


public void setPname(String pname) {
this.pname = pname;
}


public String getFlag() {
return flag;
}


public void setFlag(String flag) {
this.flag = flag;
}


@Override
public void readFields(DataInput in) throws IOException {
this.oid=in.readUTF();
this.pid=in.readUTF();
this.pname=in.readUTF();
this.amount=in.readInt();
this.flag=in.readUTF();
}


@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(oid);
out.writeUTF(pid);
out.writeUTF(pname);
out.writeInt(amount);
out.writeUTF(flag);

}


}



//=========================================



package cn.nyzc.reducejoin;


import java.io.IOException;


import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;


/**
 * 
 * <p>Title: ReduceJoinMapper</p>
 * <p>Description: </p>
 * <p>Company: www.xnlc.cn</p> 
 * @author 黄庭华
 * @date 2016年7月17日下午2:52:52
 * @version 1.0
 */
public class ReduceJoinMapper extends Mapper<LongWritable, Text, Text, OrderBean> {


// 输出数据的暂存容器
OrderBean bean = new OrderBean();
Text text = new Text();


@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {


// 首先判断输入数据出自哪张表
FileSplit sp = (FileSplit) context.getInputSplit();
String name = sp.getPath().getName();


// 判断
if (name.startsWith("order")) {
// 获取数据
String[] values = value.toString().split("\t");
// 处理数据
bean.setOrder(values[0], values[1], Integer.parseInt(values[2]));
text.set(values[1]);


} else if (name.startsWith("pd")) {
// 获取数据
String[] values = value.toString().split("\t");
// 处理数据
bean.setPro(values[0], values[1]);
text.set(values[0]);
}


// 输出数据
context.write(text, bean);


}


}



//============================================



package cn.nyzc.reducejoin;


import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;


import org.apache.commons.beanutils.BeanUtils;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;


/**
 * 
 * <p>Title: ReduceJoinReducer</p>
 * <p>Description: </p>
 * <p>Company: www.xnlc.cn</p> 
 * @author 黄庭华
 * @date 2016年7月17日下午2:51:48
 * @version 1.0
 */
public class ReduceJoinReducer extends Reducer<Text, OrderBean, OrderBean, NullWritable>{

//输出数据的暂存容器
List<OrderBean> olist=new ArrayList<>();
String pname;
//OrderBean pro=new OrderBean(); 


@Override
protected void reduce(Text key, Iterable<OrderBean> values,
Context context) throws IOException, InterruptedException {
//进入方法之前,先把缓存容器清空
olist.clear();

//遍历并分别处理bean对象
for (OrderBean orderBean : values) {
//取出判断的标记
String flag = orderBean.getFlag();
//判断bean对象的类型
if(flag.equals("0")){
OrderBean buf=new OrderBean();
try {
BeanUtils.copyProperties(buf, orderBean);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
//把遍历出来的bean添加到缓存容器中
olist.add(buf);

}else if(flag.equals("1")){
//把需要合并的字段缓存一下
pname=orderBean.getPname();
}
}


//输出数据
for (OrderBean bean : olist) {
//把合并的短缺字段补齐
bean.setPname(pname);
context.write(bean, NullWritable.get());
}

}


}



//======================================



package cn.nyzc.reducejoin;


import java.io.IOException;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


/**
 * 任务驱动类
 * <p>Title: ReduceJoinDriver</p>
 * <p>Description: </p>
 * <p>Company: www.xnlc.cn</p> 
 * @author 黄庭华
 * @date 2016年7月17日下午2:54:27
 * @version 1.0
 */
public class ReduceJoinDriver {

public static void main(String[] args) throws Exception {
args=new String[]{"e:/fortest/input03","e:/output01"};

//1 创建任务对象Job
Job job = Job.getInstance(new Configuration());

//2 设置jar所在位置
job.setJarByClass(ReduceJoinDriver.class);

//3 设置mapreduce程序运行的主类
job.setMapperClass(ReduceJoinMapper.class);
job.setReducerClass(ReduceJoinReducer.class);


//4 设置各阶段输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(OrderBean.class);
job.setOutputKeyClass(OrderBean.class);
job.setOutputValueClass(NullWritable.class);

//5 设置数据源和结果数据的路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

//6 提交
boolean b = job.waitForCompletion(true);
System.exit(b?0:1);

}


}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值