zoukankan      html  css  js  c++  java
  • mapreduce去重

    现有一个某电商网站的数据文件,名为buyer_favorite1,记录了用户收藏的商品以及收藏的日期,文件buyer_favorite1中包含(用户id,商品id,收藏日期)三个字段,数据内容以“ ”分割,由于数据很大,所以为了方便统计我们只截取它的一部分数据,内容如下:

    买家id   商品id    收藏日期  
    10181   1000481   2010-04-04 16:54:31  
    20001   1001597   2010-04-07 15:07:52  
    20001   1001560   2010-04-07 15:08:27  
    20042   1001368   2010-04-08 08:20:30  
    20067   1002061   2010-04-08 16:45:33  
    20056   1003289   2010-04-12 10:50:55  
    20056   1003290   2010-04-12 11:57:35  
    20056   1003292   2010-04-12 12:05:29  
    20054   1002420   2010-04-14 15:24:12  
    20055   1001679   2010-04-14 19:46:04  
    20054   1010675   2010-04-14 15:23:53  
    20054   1002429   2010-04-14 17:52:45  
    20076   1002427   2010-04-14 19:35:39  
    20054   1003326   2010-04-20 12:54:44  
    20056   1002420   2010-04-15 11:24:49  
    20064   1002422   2010-04-15 11:35:54  
    20056   1003066   2010-04-15 11:43:01  
    20056   1003055   2010-04-15 11:43:06  
    20056   1010183   2010-04-15 11:45:24  
    20056   1002422   2010-04-15 11:45:49  
    20056   1003100   2010-04-15 11:45:54  
    20056   1003094   2010-04-15 11:45:57  
    20056   1003064   2010-04-15 11:46:04  
    20056   1010178   2010-04-15 16:15:20  
    20076   1003101   2010-04-15 16:37:27  
    20076   1003103   2010-04-15 16:37:05  
    20076   1003100   2010-04-15 16:37:18  
    20076   1003066   2010-04-15 16:37:31  
    20054   1003103   2010-04-15 16:40:14  
    20054   1003100   2010-04-15 16:40:16  
    View Code

    要求用Java编写MapReduce程序,根据商品id进行去重,统计用户收藏商品中都有哪些商品被收藏。

    源代码:

    package mapreduce;
    
    import java.io.IOException;
    import java.util.StringTokenizer;
    
    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.Reducer.Context;
    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 mapreduce.WordCount.MyMapper;
    import mapreduce.WordCount.MyReducer;
    
    public class Filter {
        public static class Map extends Mapper<Object, Text, Text, NullWritable> {
            private static Text newKey = new Text();
    
            public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
                StringTokenizer itr = new StringTokenizer(value.toString());
    
                while (itr.hasMoreTokens()) {
                    String line = itr.nextToken();
                    String arr = line.substring(0, line.indexOf("   "));
                    newKey.set(arr);
                    System.out.println(arr);
                    context.write(newKey, NullWritable.get());
    
                }
            }
    
        }
    
        public static class Reduce extends Reducer<Text, NullWritable, Text, NullWritable> {
            public void reduce(Text key, Iterable<NullWritable> values, Context context)
                    throws IOException, InterruptedException {
    
                context.write(key, NullWritable.get());
            }
        }
    
        public static void main(String[] args) throws Exception {
    
            Configuration conf = new Configuration();
            System.out.println("start");
            Job job = new Job(conf, "filter");
            job.setJarByClass(Filter.class);
            job.setMapperClass(Map.class);
            job.setReducerClass(Reduce.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(NullWritable.class);
            job.setInputFormatClass(TextInputFormat.class);
            job.setOutputFormatClass(TextOutputFormat.class);
            Path in = new Path("hdfs://localhost:9000/mymapreduce2/in/buyer_favorite1");
            Path out = new Path("hdfs://localhost:9000/mymapreduce2/out");
    
            FileInputFormat.addInputPath(job, in);
            FileOutputFormat.setOutputPath(job, out);
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }

    统计数据:

    10181
    20001
    20042
    20054
    20055
    20056
    20064
    20067
    20076
    买家id

    遇到的问题:

    1.这次代码和上次代码很相似,所以这次代码石油上次代码复制粘贴过来改了一下。但是忘了该main函数中"job.setJarByClass(Filter.class);job.setMapperClass(Map.class);job.setReducerClass(Reduce.class);"。所以一直运行的是上次写的代码。

    后来改了过来。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    pyqt动画的使用
    pyqt 自定义信号
    设计工具- QtDesigner
    样式控制-QSS 样式表
    布局管理之 QStackedLayout (堆 布局)
    布局管理之 QGridLayout (网格布局)
    布局管理之 QFormLayout (表单布局)
    看代码中
    公司同事好坑
    我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)
  • 原文地址:https://www.cnblogs.com/wl2017/p/9978119.html
Copyright © 2011-2022 走看看