离线计算两两之间的共同好友

目录

  • 1.需求:离线计算两两之间的共同好友
  • 2.思路:分两步

1.需求:离线计算两两之间的共同好友

2.思路:分两步

第一步:计算<友,[人,人,..]>

static class sharedFriendsStepOneMapper extends Mapper<LongWritable, Text, Text, Text>{
        String person = "";
        String friends = "";
        Text _friend = new Text();
        Text _person = new Text();

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            String[] personAndFriends = line.split(":");
            person = personAndFriends[0];
            friends = personAndFriends[1];

            for(String friend : friends.split(",")){
                _friend.set(friend);
                _person.set(person);
                context.write(_friend, _person);
            }
        }
    }

    static class sharedFriendsStepOneReducer extends Reducer <Text, Text,Text, Text>{

        @Override
        protected void reduce(Text friend, Iterable<Text> persons, Context context) throws IOException, InterruptedException {
            Text _persons = new Text();
            StringBuffer sb = new StringBuffer();

            for(Text person : persons){
                sb.append(person);
                sb.append(",");
            }
            _persons.set(sb.toString());
            context.write(friend, _persons);
        }
    }

第二步:计算<人-人,[友,友,..]>

    static class sharedFriendsStepTwoMapper extends Mapper<LongWritable,Text,Text,Text>{
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            String[] friendAndPersons = line.split("\t");
            String friend = friendAndPersons[0];
            String[] persons = friendAndPersons[1].split(",");
            Arrays.sort(persons);

            for(int i = 0; i<persons.length-1; i++){
                for(int j = i+1; j<persons.length; j++){
                    context.write(new Text(persons[i] + "-" + persons[j]), new Text(friend));
                }
            }
        }
    }

    static class sharedFriendsStepTwoReducer extends Reducer<Text,Text,Text,Text>{
        @Override
        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            StringBuffer sb = new StringBuffer();
            for(Text value : values){
                sb.append(value).append(",");
            }
            context.write(key,new Text(sb.toString()));
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值