zoukankan      html  css  js  c++  java
  • Mapreduce实例——求平均值

    现有某电商关于商品点击情况的数据文件,表名为goods_click,包含两个字段(商品分类,商品点击次数),分隔符“\t”,内容如下:

    商品分类    商品点击次数
    52127    5
    52120    93
    52092    93
    52132    38
    52006    462
    52109    28
    52109    43
    52132    0
    52132    34
    52132    9
    52132    30
    52132    45
    52132    24
    52009    2615
    52132    25
    52090    13
    52132    6
    52136    0
    52090     10
    52024    347
    goods_click

    使用mapreduce统计出每类商品的平均点击次数

    package mapreduce4;
    
    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    import org.omg.CORBA.PUBLIC_MEMBER;
    
    
    //02.Mapreduce实例——求平均值
    public class MyAverage {
        public static class Map extends Mapper<Object,Text,Text,IntWritable>{
            private static Text newKey = new Text();
            public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
                String line = value.toString();
                System.out.println(line);
                String arr[] = line.split("\t");
                newKey.set(arr[0]);
                int click=Integer.parseInt(arr[1]);
                context.write(newKey, new IntWritable(click));
            }
        }
        public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable>{
            public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{
                int num=0;
                int count=0;
                for(IntWritable val:values){
                    num+=val.get();
                    count++;
                }
                int avg=num/count;
                context.write(key,new IntWritable(avg));
            }
        }
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
            Configuration conf=new Configuration();
            System.out.println("start");
            Job job =new Job(conf,"MyAverage");
            job.setJarByClass(MyAverage.class);
            job.setMapperClass(Map.class);
            job.setReducerClass(Reduce.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            job.setInputFormatClass(TextInputFormat.class);
            job.setOutputFormatClass(TextOutputFormat.class);
            Path in=new Path("hdfs://192.168.51.100:8020/mymapreduce4/in/goods_click");
            Path out=new Path("hdfs://192.168.51.100:8020/mymapreduce4/out");
            FileInputFormat.addInputPath(job,in);
            FileOutputFormat.setOutputPath(job,out);
            System.exit(job.waitForCompletion(true) ? 0 : 1);
    
        }
    }

    结果:

    原理:

    求平均数是MapReduce比较常见的算法,求平均数的算法也比较简单,一种思路是Map端读取数据,在数据输入到Reduce之前先经过shuffle,将map函数输出的key值相同的所有的value值形成一个集合value-list,然后将输入到Reduce端,Reduce端汇总并且统计记录数,然后作商即可

  • 相关阅读:
    高效真实的云渲染算法 【转】
    网络字节顺序 【转】
    Windows网络编程 2 【转】
    windows 网络编程[转]
    电信诈骗
    winsock 收发广播包 【转】
    windows核心编程 DLL技术 【转】
    CityEngine结合ArcGIS制作地质体web场景 [转]
    共有49款Windows GUI开发框架开源软件 【转】
    详解分级基金(杠杆基金)【精华】 【转】
  • 原文地址:https://www.cnblogs.com/Arisf/p/15576210.html
Copyright © 2011-2022 走看看