MapReduce-API(3)好友推荐FOF

是简单的好友列表的差集吗?
最应该推荐的好友TopN,如何排名?

思路:
推荐者与被推荐者一定有一个或多个相同的好友
全局去寻找好友列表中两两关系
去除直接好友
统计两两关系出现次数

API:
map:按好友列表输出两俩关系
reduce:sum两两关系
再设计一个MR
生成详细报表
  • 熟悉API
  • 会分析数据

好友数据

tom hello hadoop cat
world hadoop hello hive
cat tom hive
mr hive hello
hive cat hadoop world hello mr
hadoop tom hive world
hello tom world hive mr
推荐好友的好友

好友推荐FOF
只读1行,得直接好友关系 & 间接好友关系!(有一部分是直接好友关系,要去掉)

  • 一个表,产生2个虚表,再做差集,就是间接好友关系!

好友推荐

public class MyFOF {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration(true);
        
        Job job = Job.getInstance(conf);
        job.setJarByClass(MyFOF.class);
        
        Path input = new Path("/data/fof/input");
        FileInputFormat.addInputPath(job, input);
        
        Path output = new Path("/data/fof/output");
        if (output.getFileSystem(conf).exists(output)) {
            output.getFileSystem(conf).delete(output, true);
        }
        FileOutputFormat.setOutputPath(job, output );
        
        job.setMapperClass(FMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        job.setReducerClass(FReducer.class);
        
        job.waitForCompletion(true);
    }
}

Map阶段

public class FMapper extends Mapper {
    Text mkey= new Text();
    IntWritable mval = new IntWritable();
    
    @Override
    protected void map(LongWritable key, Text value,Context context)
            throws IOException, InterruptedException {
        
        // value:
        // tom hello hadoop cat  ---- tom:hello  0   ----  hello:hadoop  1

        String[] strs = StringUtils.split(value.toString(), ' ');

        for (int i=1; i 0) {
            // hello, hadoop
            return str2+":"+str1;
            // hadoop : hello
        }

        // hadoop, hello
        return str1+":"+str2;
        // hadoop : hello
    }   
}

Reduce阶段

public class FReducer  extends  Reducer {
    
    Text rval = new Text();
    @Override
    protected void reduce(Text key, Iterable values, Context context)
            throws IOException, InterruptedException {
        // hadoop:hello  1
        // hadoop:hello  0
        // hadoop:hello  1
        // hadoop:hello  1
        int sum = 0;
        int flg = 0;
        for (IntWritable v : values) {
            if(v.get() == 0) {
                // hadoop:hello  0 是直接好友关系
                flg = 1; 
            }
            sum += v.get();
        }
        if(flg == 0) { // 只输出间接好友关系
            rval.set(sum+"");
            context.write(key, rval);
        }
    }
}

输出结果,间接好友个数

cat:hadoop 2
cat:hello 2
cat:mr 1
cat:world 1
hadoop:hello 3
hadoop:mr 1
hive:tom 3
mr:tom 1
mr:world 2
tom:world 2
  • 下一步:生成每个人的top1的推荐,最应该推荐的谁!

你可能感兴趣的:(MapReduce-API(3)好友推荐FOF)