分析用户玩家流失率
(流失:如果一用户登陆某游戏某区服后接下来一周时间内登陆该区服的天数少于2天,则认为该用户已流失)
日志格式如下:
- {"cnt":3,"src":"bbs","time":20130622063117,"qid":"100005648","gkey":"yjjh","skey":"S9"}
- {"cnt":2,"src":"null","time":20130622005615,"qid":"100015499","gkey":"dgwm","skey":"592120005"}
- {"cnt":5,"src":"txt","time":20130622044917,"qid":"100021254","gkey":"yjjh","skey":"S1"}
- {"cnt":1,"src":"null","time":20130622090137,"qid":"100023162","gkey":"wulin","skey":"S20"}
- {"cnt":1,"src":"null","time":20130622090417,"qid":"100024132","gkey":"wulin","skey":"S20"}
- {"cnt":1,"src":"null","time":20130622090526,"qid":"100025487","gkey":"wulin","skey":"S20"}
- {"cnt":1,"src":"loginhistory","time":20130622101001,"qid":"100030555","gkey":"sxd","skey":"S149"}
- {"cnt":1,"src":"se-yxlist-frxz","time":20130622101158,"qid":"100035304","gkey":"frxz","skey":"S12"}
- {"cnt":5,"src":"se","time":20130622100838,"qid":"100035995","gkey":"ktpd","skey":"S9"}
- {"cnt":2,"src":"null","time":20130622101413,"qid":"100035995","gkey":"xjsj","skey":"S22"}
每条日志记录某用户在一天之内登陆某游戏区服的情况:
- cnt:登陆次数
- src:来源
- time:第一次登陆时间
- qid:用户ID
- gkey:游戏ID
- skey:区服ID
步骤:
1.导入数据
- create external table login_interm (cnt string,src string,time string,qid string,gkey string,skey string) row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' with SERDEPROPERTIES ('input.regex' = '\\{"cnt":([^,]*),"src":"([^"]*)","time":([^,]*),"qid":"([^"]*)","gkey":"([^"]*)","skey":"([^"]*)"\}','output.format.string' = '%1$s %2$s %3$s %4$s %5$s %6$s') location '/login_logs/';
- create external table login_info (cnt string,src string,time string,qid string,gkey string,skey string) PARTITIONED BY(pgkey STRING) CLUSTERED BY(skey,qid) SORTED BY(skey,qid,time) INTO 32 BUCKETS stored as SEQUENCEFILE;
- from login_interm insert overwrite table login_info PARTITION (pgkey) select cnt,src,time,qid,gkey,skey,gkey;
几点说明:
- 因dynamic partition,无法直接将日志文件load进login_info表,需要login_interm来完成字符串正则匹配
- 动态分区的数目:对于低版本内核,如果分区较多,使用python执行reduce操作时会报错"Hive. java.io.IOException: error=7, Argument list too long"(参见https://groups.google.com/a/cloudera.org/forum/#!topic/cdh-user/dSGrvvNhCcQ)
2.提取
- create table login_stat_use_reduce (login_times int,login_days int,qid string,gkey string,skey string);
- add file '/home/hadoop/reduce.py';
- from (select cnt,time,qid,gkey,skey from login_info where cnt is not null distribute by gkey,skey,qid sort by gkey,skey,qid,time) map_out insert overwrite table login_stat_use_reduce reduce cnt,time,qid,gkey,skey using '/usr/bin/python2.7 ./reduce.py' as login_times,days,qid,gkey,skey;
- distribute by:
其中reduce.py:
- #!/usr/bin/python2.7
- #coding:utf-8
- import datetime
- import time
- import sys,logging
- def datetime_toString(dt):
- """把datetime转成字符串"""
- return dt.strftime("%Y%m%d")
- def string_toDatetime(string):
- """把字符串转成datetime"""
- return datetime.datetime.strptime(string, "%Y%m%d")
- def string_toTimestamp(strTime):
- """把字符串转成时间戳形式"""
- return time.mktime(string_toDatetime(strTime).timetuple())
- def timestamp_toString(stamp):
- """把时间戳转成字符串形式"""
- return time.strftime("%Y%m%d%H", time.localtime(stamp))
- def datetime_toTimestamp(dateTime):
- """把datetime类型转外时间戳形式"""
- return time.mktime(dateTime.timetuple())
- def substract_DateTime(dateStr1,dateStr2):
- """ 返回两个日期之间的差 """
- d1=string_toDatetime(dateStr1)
- d2=string_toDatetime(dateStr2)
- return d2-d1
- def substract_TimeStamp(dateStr1,dateStr2):
- """ 两个日期的 timestamp 差值 """
- ts1= string_toTimestamp(dateStr1)
- ts2= string_toTimestamp(dateStr2)
- return ts1-ts2
- def compare_dateTime(dateStr1,dateStr2):
- """两个日期的比较, 当然也可以用timestamep方法比较,都可以实现."""
- date1 = string_toDatetime(dateStr1)
- date2 = string_toDatetime(dateStr2)
- return date1.date()>date2.date()
- def dateTime_Add(dateStr,days=0):
- """ 指定日期加上 一个时间段,天,小时,或分钟之后的日期 """
- date1= string_toDatetime(dateStr)
- return date1+datetime.timedelta(days=days)
- first_line = 1;
- pre_login_days = 0
- pre_login_cnt = 0
- pre_gkey = ""
- pre_skey = ""
- pre_qid = ""
- logging.basicConfig(level=logging.DEBUG,
- format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
- datefmt='%a, %d %b %Y %H:%M:%S',
- filename='./worker.log',
- filemode='a')
- for line in sys.stdin:
- line = line.strip().strip('\t');
- logging.error("data:"+line)
- if line == "":
- continue
- cnt,time,qid,gkey,skey = line.split('\t')
- if not cnt or not time or not qid or not gkey or not skey:
- continue
- login_date = time[0:8]
- if first_line:
- lost = 0;
- pre_gkey = gkey
- pre_skey = skey
- pre_qid = qid
- pre_login_days = 1
- pre_login_date = login_date
- pre_login_cnt = eval(cnt)
- first_line = 0
- continue
- if gkey != pre_gkey or skey != pre_skey or qid != pre_qid:
- if pre_login_days < 3:
- print "%d\t%d\t%s\t%s\t%s"%(pre_login_cnt,pre_login_days,pre_qid,pre_gkey,pre_skey)
- lost = 0;
- pre_gkey = gkey
- pre_skey = skey
- pre_qid = qid
- pre_login_days = 1
- pre_login_date = login_date
- pre_login_cnt = eval(cnt)
- else:
- if lost or pre_login_days >= 3:
- continue
- if compare_dateTime(login_date,datetime_toString(dateTime_Add(pre_login_date,7))):
- lost = 1
- continue
- pre_login_days += 1
- pre_login_cnt += eval(cnt)
- if pre_login_days < 3:
- print "%d\t%d\t%s\t%s\t%s"%(pre_login_cnt,pre_login_days,pre_qid,pre_gkey,pre_skey)
http://godlovesdog.iteye.com/blog/1898200
相关推荐
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...
第3部分(第12章)讲解两个大数据项目,包络网页日志离线项目和实时项目,在CDH版本环境下通过这两个项目将Hadoop和Spark原生态组件进行整合,一步步带领读者学习和实战操作。 本书适合想要快速掌握大数据技术的...
Hadoop是一个开源的MapReduce平台,设计运行在大型分布式集群环境中,提供查询和分析服务。尤其适用于大数据系统,Hadoop为苹果、eBay、LinkedIn、雅虎和Facebook等公司提供重要软件环境。它为开发者进行数据存储、...
《Hadoop实战》是一本系统且极具实践指导意义的hadoop工具书和参考书。内容全面,对hadoop整个技术体系进行了全面的讲解,不仅包括hdfs和mapreduce这两大核心内容,而且还包括hive、hbase、mahout、pig、zookeeper、...
《Hadoop实战》是一本系统且极具实践指导意义的hadoop工具书和参考书。内容全面,对hadoop整个技术体系进行了全面的讲解,不仅包括hdfs和mapreduce这两大核心内容,而且还包括hive、hbase、mahout、pig、zookeeper、...
24012.4.2 ES2爬虫 24112.4.3 ES2分析 24212.4.4 小结 24912.4.5 参考文献 250附录A HDFS文件命令 251构建hadoop运算坚实的平台编辑百度构建了超大规模的服务器集群来运行Hadoop,其中日志处理与分析占到...
第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章 实现数据导入导出...
《Hadoop实战》是一本系统且极具实践指导意义的Hadoop工具书和参考书。内容全面,对Hadoop整个技术体系进行了全面的讲解,不仅包括HDFS和MapReduce这两大核心内容,而且还包括Hive、HBase、Mahout、Pig、ZooKeeper、...
本教程以离线综合项目实战-日志流量分析为例全程演示了数据仓库设计与分析模型构建,内容包括但不限于: 01 PageView模型的介绍及实现思路分析 02 PageView分析模型Mapper代码的实现 03 PageView分析模型Driver...
本课程从Hadoop核心技术入手,以电商项目为依托,带领你从0基础开始上手,逐步掌握大数据核心技术(如:HDFS、YARN、MapReduce以及Hive),并使用这些技术进行实战,最终完成电商行为日志分析项目,让你轻松入门...
知识点介绍、代码演示、逻辑分析、灵活举例、使用图形的方式详细演示代码的流程和细节、整合企业级实战案例,全面讲解并突出重点,让学习也变成一种快乐。 课程亮点 1,知识体系完备,阶段学习者都能学有所获。 2,...
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$...