mapreduce

 

public class AppUserProfileChangeChannelJoin  {


    public static class Mapper extends Mapper<Object, Writable, Text, Text> {
        private UserProfile up = new UserProfile();


        @Override
        protected void map(Object key, Writable value, Context context) throws IOException, InterruptedException {
            String[] tmp = StringUtils.splitPreserveAllTokens(value.toString(), ZPConstants.FIELDS_TAB);


            if (tmp.length == 1) {
                context.write(new Text(key.toString()), new Text(value.toString()));
            } else if (tmp.length >= 27) {
                up.parseToUserProfile(tmp);
                if (up.isValidRecord()) {
                    String deviceId = up.getAppkey().trim() + ZPConstants.FIELDS_SPLIT + up.getIdfa().trim()
                            + ZPConstants.FIELDS_SPLIT + up.getMac().trim() + ZPConstants.FIELDS_SPLIT + up.getAndroidid().trim()
                            + ZPConstants.FIELDS_SPLIT + up.getImei().trim();
                    context.write(new Text(deviceId), new Text(up.toString()));
                }
            }
        }
    }


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


        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            String channel = null;
            UserProfile up = null;


            for (Text value : values) {
                String tmp = value.toString();
                String[] fields = StringUtils.splitPreserveAllTokens(tmp, ZPConstants.FIELDS_TAB);


                if (fields.length >= 27) {
                    up = new UserProfile();
                    up.parseToUserProfile(fields);
                } else if (fields.length == 1) {
                    channel = fields[0];
                }
            }


            if (up != null && channel != null && StringUtils.isNotBlank(channel) && StringUtils.isNotEmpty(channel)) {
                up.setChannelid(channel);
                context.write(new Text(""), new Text(up.toString()));
            }


            if (up != null && channel == null) {
                context.write(new Text(""), new Text(up.toString()));
            }
        }
    }


    @Override
    protected void execute() throws Exception {


        Job job = new Job(getConfiguration(), getJobName());
        job.setJarByClass(AppUserProfileChangeChannelJoin.class);     // class that contains mapper


        job.setMapperClass(AppUserProfileChangeChannelMapper.class);
        job.setReducerClass(AppUserProfileChangeChannelReducer.class);
        job.setInputFormatClass(SequenceFileInputFormat.class);
        job.setOutputFormatClass(SequenceFileOutputFormat.class);


        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);


        job.setReduceSpeculativeExecution(false);
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值