.用户流量案例
统计每个用户的总流量
统计每个用户的总访问量 , map端以用户的手机号为key输出, 以用户的记录bean为value
reduce会将数据按照用户的手机号分组 , reduce中统计各个用户的总流量,输出用户手机号和用户的总流量
**
FlowBean
**
public class FlowBean implements Writable{
private String tel ;//电话
private String url ;//连接信息
private double downFlow ;//上传流量
private double upFlow ;//下载流量
**
mapreduce程序
**
public class FlowDemo {
public static class FlowMapper extends Mapper<LongWritable, Text, Text, FlowBean> {
Text k = new Text();
FlowBean v = new FlowBean();
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, FlowBean>.Context context)
throws IOException, InterruptedException {
// 13026230503 http://v.baidu.com/tv 20 5000
String[] split = value.toString().split("\\s");
String tel = split[0];
String url = split[1];
double upFlow = Double.parseDouble(split[2]);
double downFlow = Double.parseDouble(split[3]);
k.set(tel);
v.setTel(tel);
v.setUpFlow(upFlow);
v.setDownFlow(downFlow);
v.setUrl(url);
context.write(k, v);
}
}
public static class FlowReducer extends Reducer<Text, FlowBean, Text, DoubleWritable> {
@Override
protected void reduce(Text tel, Iterable<FlowBean> iter,
Reducer<Text, FlowBean, Text, DoubleWritable>.Context context)
throws IOException, InterruptedException {
double count = 0 ;
for (FlowBean flowBean : iter) {
count+=flowBean.getUpFlow()+flowBean.getDownFlow() ;
}
context.write(tel ,new DoubleWritable(count));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
/*conf.set("mapreduce.framework.name","local");
conf.set("fs,defaultFS", "file:///");*/
Job job = Job.getInstance(conf);
job.setMapperClass(FlowMapper.class);
job.setReducerClass(FlowReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(FlowBean.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
FileInputFormat.setInputPaths(job, new Path("d:/data/flow/input"));
FileOutputFormat.setOutputPath(job, new Path("d:/data/flow/output"));
job.setNumReduceTasks(1);
boolean b = job.waitForCompletion(true);
System.exit(b?0:-1);
}
}