NewInstallUserMapper.class阅读笔记

NewInstallUserMapper的所有属性方法.png
package com.sxt.transformer.mr.nu;

import java.io.IOException;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.log4j.Logger;

import com.sxt.common.DateEnum;
import com.sxt.common.EventLogConstants;
import com.sxt.common.KpiType;
import com.sxt.transformer.model.dim.StatsCommonDimension;
import com.sxt.transformer.model.dim.StatsUserDimension;
import com.sxt.transformer.model.dim.base.BrowserDimension;
import com.sxt.transformer.model.dim.base.DateDimension;
import com.sxt.transformer.model.dim.base.KpiDimension;
import com.sxt.transformer.model.dim.base.PlatformDimension;
import com.sxt.transformer.model.value.map.TimeOutputValue;

/**
 * 自定义的计算新用户的mapper类
 * 
 * @author root
 *
 */
public class NewInstallUserMapper extends 
                    TableMapper<StatsUserDimension, TimeOutputValue> 
                    {//每个分析条件(由各个维度组成的)作为key,uuid作为value
    private static final Logger logger = 
            Logger.getLogger(NewInstallUserMapper.class);
//  Mapper的输出key  date platform kpi browser
    private StatsUserDimension statsUserDimension = 
            new StatsUserDimension();
//  Mapper的输出value 主要用id排重
    private TimeOutputValue timeOutputValue = 
            new TimeOutputValue();
//  列簇
    private byte[] family = 
            Bytes.toBytes(
                    EventLogConstants.EVENT_LOGS_FAMILY_NAME);
//  代表用户分析模块的统计
    private KpiDimension newInstallUserKpi = 
            new KpiDimension(
                    KpiType.NEW_INSTALL_USER.name);
//  浏览器分析模块的统计
    private KpiDimension newInstallUserOfBrowserKpi = 
            new KpiDimension(
                    KpiType.BROWSER_NEW_INSTALL_USER.name);

    /**
     * map 读取hbase中的数据,输入数据为:hbase表中每一行。
     * 输出key类型:StatsUserDimension
     * value类型:TimeOutputValue
     */
    @Override
    protected void map(ImmutableBytesWritable key, Result value, Context context) 
                             throws IOException, InterruptedException {
        String uuid = 
                Bytes.toString(
                        value.getValue(
                                family, 
                                Bytes.toBytes(
                                        //u_ud
                                        EventLogConstants.LOG_COLUMN_NAME_UUID)));
        String serverTime = Bytes.toString(
                value.getValue(family, 
                        Bytes.toBytes(
                                //s_time
                                EventLogConstants.LOG_COLUMN_NAME_SERVER_TIME)));
        String platform = Bytes.toString(
                value.getValue(family, 
                        Bytes.toBytes(
                                //pl
                                EventLogConstants.LOG_COLUMN_NAME_PLATFORM)));
        
        System.out.println(uuid + "-" + serverTime + "-" + platform);
        
        if (StringUtils.isBlank(uuid) || 
                StringUtils.isBlank(serverTime) || 
                StringUtils.isBlank(platform)) {
            logger.warn("uuid&servertime&platform不能为空");
            return;
        }
        long longOfTime = Long.valueOf(serverTime.trim());
        timeOutputValue.setId(uuid); // 设置id为uuid
        timeOutputValue.setTime(longOfTime); // 设置时间为服务器时间
        DateDimension dateDimension = 
                //根据type类型获取对应的时间维度对象
                DateDimension.buildDate(longOfTime, DateEnum.DAY);
        List<PlatformDimension> platformDimensions =
                //构建多个平台维度信息对象集合 增加all
                PlatformDimension.buildList(platform);

        // 设置date维度
        StatsCommonDimension statsCommonDimension = 
                this.statsUserDimension.getStatsCommon();
        statsCommonDimension.setDate(dateDimension);
        // 写browser相关的数据
        String browserName = Bytes.toString(
                value.getValue(family, 
                        Bytes.toBytes(
                                //browser
                                EventLogConstants.LOG_COLUMN_NAME_BROWSER_NAME)));
        String browserVersion = Bytes.toString(
                value.getValue(family, 
                        Bytes.toBytes(
                                //browser_v
                                EventLogConstants.LOG_COLUMN_NAME_BROWSER_VERSION)));
        List<BrowserDimension> browserDimensions = 
                //构建多个浏览器维度信息对象集合
                BrowserDimension.buildList(browserName, browserVersion);
        //空浏览器维度,不考虑浏览器维度
        BrowserDimension defaultBrowser = new BrowserDimension("", "");
        for (PlatformDimension pf : platformDimensions) {
            // 1. 设置为一个默认值
            statsUserDimension.setBrowser(defaultBrowser);
            // 2. 解决有空的browser输出的bug
            // statsUserDimension.getBrowser().clean();
            statsCommonDimension.setKpi(newInstallUserKpi);
            statsCommonDimension.setPlatform(pf);
            context.write(statsUserDimension, timeOutputValue);
            for (BrowserDimension br : browserDimensions) {
                statsCommonDimension.setKpi(newInstallUserOfBrowserKpi);
                // 1. 
                statsUserDimension.setBrowser(br);
                // 2. 由于上面需要进行clean操作,故将该值进行clone后填充
                // statsUserDimension.setBrowser(
                                 WritableUtils.clone(br, context.getConfiguration()));
                context.write(statsUserDimension, timeOutputValue);
            }
        }
    }
}


public class NewInstallUserMapper extends 
                    TableMapper<StatsUserDimension, TimeOutputValue> 
                    {//每个分析条件(由各个维度组成的)作为key,uuid作为value
    private static final Logger logger = 
            Logger.getLogger(NewInstallUserMapper.class);
    private StatsUserDimension statsUserDimension = 
            new StatsUserDimension();
    private TimeOutputValue timeOutputValue = 
            new TimeOutputValue();
    private byte[] family = 
            Bytes.toBytes(EventLogConstants.EVENT_LOGS_FAMILY_NAME);
    private KpiDimension newInstallUserKpi = 
            new KpiDimension(KpiType.NEW_INSTALL_USER.name);//代表用户分析模块的统计
    private KpiDimension newInstallUserOfBrowserKpi = 
            new KpiDimension(KpiType.BROWSER_NEW_INSTALL_USER.name);//浏览器分析模块的统计

项目入口
http://www.jianshu.com/p/aa3b12b0d426

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • {"keys":[{"key2":"余华","key":"活着","url":"https://www.jians...
    书籍数据记录阅读 495评论 0 0
  • 北京时间10月2日,据《圣何塞水星新闻》报道,昨天勇士与掘金的季前赛开始之前,4届最佳防守球员本-华莱士把上赛季的...
    coco9981阅读 508评论 0 1
  • 最近自己写的简书文章太多了,导致很难找到之前写的文章。 于是,我想整理一篇目录,使用搜索快捷键:ctrl+F,即可...
    张云钱阅读 1,613评论 0 1
  • 果宝成长日记119天床上有一点渣子都要把它弄干净才睡觉。你扣床靠背的时候,稍微大点声说你就哭起来。 今天下了一天的...
    果爸性教育阅读 187评论 0 1
  • 本文参加【六专题】八月征文【月圆之夜】 晚风拂悲凉,军人独自醉美酒,花好月圆夜,军人何处寻城楼? 2017年8月1...
    史铣泩阅读 875评论 39 26