需求
统计某游戏平台新用户渠道来源
日志格式如下:
- Jul 23 0:00:47 [info] {SPR}gjzq{SPR}20130723000047{SPR}85493108{SPR}S1{SPR}{SPR}360wan-2j-reg{SPR}58.240.209.78{SPR}
分析
问题的关键在于先找出新用户
新用户:仅在7月份登陆过平台的用户为新用户
依据map/reduce思想,可以按照如下方式找出新用户:
- 假如某用户在某月份出现过,则(qid,year,month)=1
- 按qid汇总该用户出现过的月数,即构建(qid,count(year,month))对
- 新用户的count(year,month)=1,且(year,month)=(2013,07).
找出新用户的来源渠道
来源渠道:新用户在201307可能多次登录平台,需要找出最早登陆平台所属渠道
分两步来做:
- 找出新用户所有登陆记录(qid,logintime,src)
- 针对同一qid找出logintime最小时的src
实现
- 数据准备
1)建表
- create table if not exists glogin_daily (year int,month int,day int,hour int,logintime string,qid int,gkey string,skey string,loginip string,registsrc string,loginfrom string) partitioned by (dt string);
依据日志内容及所关心的信息创建表格,按天组织分区
2 ) 数据导入
因日志文件存在于多处,我们先将日志汇总到一临时目录,创建临时外部表将数据加载进hive,然后通过正则匹配的方式分隔出各字段。(内部表只能load单文件,通过这种方式可以load文件夹)
- echo "==== load data into tmp table $TMP_TABLE ==="
- ${SOFTWARE_BASE}/hive/bin/hive -e "create external table $TMP_TABLE (info string) location '${TMP_DIR}';"
- echo "==== M/R ==="
- CURR_YEAR=`echo $CURR_DOING|cut -b 1-4`
- CURR_MONTH=`echo $CURR_DOING|cut -b 5-6`
- CURR_DAY=`echo $CURR_DOING|cut -b 7-8`
- dt="${CURR_YEAR}-${CURR_MONTH}-${CURR_DAY}"
- ${SOFTWARE_BASE}/hive/bin/hive -e "add file ${SCRIPT_PATH}/${MAP_SCRIPT_FILE};set hive.exec.dynamic.partition=true;insert overwrite table glogin_daily partition (dt='${dt}') select transform (t.i) using '$MAP_SCRIPT_PARSER ./${MAP_SCRIPT_FILE}' as (y,m,d,h,t,q,g,s,ip,src,f) from (select info as i from ${TMP_TABLE}) t;"
其中filter_login.php:
- $fr=fopen("php://stdin","r");
- $month_dict = array(
- 'Jan' => 1,
- 'Feb' => 2,
- 'Mar' => 3,
- 'Apr' => 4,
- 'May' => 5,
- 'Jun' => 6,
- 'Jul' => 7,
- 'Aug' => 8,
- 'Sep' => 9,
- 'Oct' => 10,
- 'Nov' => 11,
- 'Dec' => 12,
- );
- while(!feof($fr))
- {
- $input = fgets($fr,256);
- $input = rtrim($input);
- //Jul 23 0:00:00 [info] {SPR}xxj{SPR}20130723000000{SPR}245396389{SPR}S9{SPR}iwan-ng-mnsg{SPR}cl-reg-xxj0if{SPR}221.5.67.136{SPR}
- if(preg_match("/([^ ]+) +(\d+) (\d+):.*\{SPR\}([^\{]*)\{SPR\}(\d+)\{SPR\}(\d+)\{SPR\}([^\{]*)\{SPR\}([^\{]*)\{SPR\}(([^\{]*)\{SPR\}([^\{]*)\{SPR\})?/",$input,$matches))
- {
- $year = substr($matches[5],0,4);
- echo $year."\t".$month_dict[$matches[1]]."\t".$matches[2]."\t".$matches[3]."\t".$matches[5]."\t".$matches[6]."\t".$matches[4]."\t".$matches[7]."\t".$matches[11]."\t".$matches[8]."\t".$matches[10]."\n";
- }
- }
- fclose ($fr);
2.找出新用户
1)用户登陆平台记录按月消重汇总
- create table distinct_login_monthly_tmp_07 as select qid,year,month from glogin_daily group by qid,year,month;
2)用户登陆平台月数
- create table login_stat_monthly_tmp_07 as select qid,count(1) as c from distinct_login_monthly_tmp_07 where year<2013 or (year=2013 and month<=7) group by qid;
平台级新用户:
1)找出登陆月数为1的用户;
2.判断这些用户是否在7月份出现,如果有出现,找出登陆所有src
- create table new_player_monthly_07 as select distinct a.qid,b.src,b.logintime from (select qid from login_stat_monthly_tmp_07 where c=1) a join (select qid,loginfrom as src,logintime from glogin_daily where month=7 and year=2013) b on a.qid=b.qid;
找出最早登陆的src:
- add file /home/game/lvbenwei/load_login/get_player_src.php;
- create table new_player_src_07 as select transform (t.qid,t.src,t.logintime) using 'php ./get_player_src.php' as (qid,src,logintime) from (select * from new_player_monthly_07 order by qid,logintime) t;
其中get_player_src.php:
- $fr=fopen("php://stdin","r");
- $curr_qid = null;
- $curr_src = null;
- $curr_logintime=null;
- while(!feof($fr))
- {
- $input = fgets($fr,1024);
- $input = rtrim($input);
- $arr = explode("\t", $input);
- $qid = trim($arr[0]);
- if(emptyempty($curr_qid)||$curr_qid != $qid)
- {
- $curr_qid = $qid;
- echo $input."\n";
- }
- }
- fclose ($fr);
平台级新用户数:
- select count(*) from new_player_src_07;
平台级各渠道新用户汇总:
- create table new_player_src_stat_07 as select src,count(*) from new_player_monthly_07 group by src;
http://godlovesdog.iteye.com/blog/1926259
相关推荐
hive日志系统实战
44.复杂日志分析-指标结果的分析实现 45.Hive中数据文件的存储格式介绍及对比 46.常见的压缩格式及MapReduce的压缩介绍 47.Hadoop中编译配置Snappy压缩 48.Hadoop及Hive配置支持snappy压缩 49.Hive中的常见调优 50....
资源内容:Hadoop数据仓库工具--hive介绍.docx;Hive高级编程.pdf;hive日志系统实战.pdf;Hive学习笔记.doc;
本课程基于企业大数据经典案例项目(大数据日志分析),全方位、全流程讲解 大数据项目的业务分析、技术选型、架构设计、集群规划、安装部署、整合继承与开发和web可视化交互设计。 不管是零基础的大数据技术爱好者...
之10.Hive工作原理和基本使用,出自《Cloudera Hadoop 4 实战课程》,hadoop入门学习教程用到技术:CDH4,Cloudera Manager,Hive,HBase,Sqoop, Hadoop培训视频教程涉及项目:电商业日志流量分析项目。
统计今天到现在为止从搜索引擎引流过来的实战课程的访问量 功能1+从搜索引擎引流过来的 HBase表设计: create 'aqy_video_search_clickcount','info' rowkey设计:根据业务需求20200529+search 功能具体实现步骤: 1...
10.2.1 序列化和反序列化技术点64 载入日志文件10.2.2 UDF、分区、分桶和压缩技术点65 编写UDF 和压缩分区表10.2.3 数据合并技术点66 优化Hive 合并10.2.4 分组、排序和explain 10.3 本章小结11 ...
全书共12章,大致分为3个部分,第1部分(第1~7章)讲解Hadoop的原生态组件,包括Hadoop、ZooKeeper、HBase、Hive环境搭建与安装,以及介绍MapReduce、HDFS、ZooKeeper、HBase、Hive原理和Apache版本环境下实战操作...
第2章详细讲解了hadoop集群的安装和配置,以及常用的日志分析技巧;第3章分析了hadoop在yahoo!、ebay、facebook和百度的应用案例,以及hadoop平台上海量数据的排序;第4-7章深入地讲解了mapreduce计算模型、...
第2章详细讲解了hadoop集群的安装和配置,以及常用的日志分析技巧;第3章分析了hadoop在yahoo!、ebay、facebook和百度的应用案例,以及hadoop平台上海量数据的排序;第4-7章深入地讲解了mapreduce计算模型、...
第5章 SQL on Hadoop:Hive 第6章 SQL to Hadoop:Sqoop 第7章 Hadoop性能调优和运维 应用篇:商业智能系统项目实战 第8章 在线图书销售商业智能系统 第9章 系统结构设计 第10章 在开发之前 第11章 实现数据导入导出...
第2章详细讲解了hadoop集群的安装和配置,以及常用的日志分析技巧;第3章分析了hadoop在yahoo!、ebay、facebook和百度的应用案例,以及hadoop平台上海量数据的排序;第4-7章深入地讲解了mapreduce计算模型、...
413.2.5 Combiner:本地reduce 433.2.6 预定义mapper和Reducer类的单词计数 433.3 读和写 433.3.1 InputFormat 443.3.2 OutputFormat 493.4 小结 50第二部分 实战第4章 编写MapReduce基础程序 524.1...
本书是Hadoop权威参考,程序员可从中探索如何分析海量数据集,管理员可以从中了解如何安装与运行Hadoop集群。 目录 第1章 初识Hadoop 数据!数据! 数据存储与分析 与其他系统相比 关系型数据库管理系统...
第2章详细讲解了hadoop集群的安装和配置,以及常用的日志分析技巧;第3章分析了hadoop在yahoo!、ebay、facebook和百度的应用案例,以及hadoop平台上海量数据的排序;第4-7章深入地讲解了mapreduce计算模型、...
第2章详细讲解了Hadoop集群的安装和配置,以及常用的日志分析技巧;第3章分析了Hadoop在Yahoo!、eBay、Facebook和百度的应用案例,以及Hadoop平台上海量数据的排序;第4-7章深入地讲解了MapReduce计算模型、...
本教程以离线综合项目实战-日志流量分析为例全程演示了数据仓库设计与分析模型构建,内容包括但不限于: 01 PageView模型的介绍及实现思路分析 02 PageView分析模型Mapper代码的实现 03 PageView分析模型Driver...
本课程从Hadoop核心技术入手,以电商项目为依托,带领你从0基础开始上手,逐步掌握大数据核心技术(如:HDFS、YARN、MapReduce以及Hive),并使用这些技术进行实战,最终完成电商行为日志分析项目,让你轻松入门...
32_数仓采集_日志采集Flume配置分析.avi U6 j% Q4 F$ T6 U5 ^ 33_数仓采集_ETL拦截器.avi 34_数仓采集_分类型拦截器.avi! b5 ^. a8 ^; }$ x8 z) l2 U3 }" p 35_数仓采集_日志采集Flume启动停止脚本.avi2 ~/ r- J: h$...