分析用户玩家流失率
(流失:如果一用户登陆某游戏某区服后接下来一周时间内登陆该区服的天数少于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是一个极其重要的工具,它被广泛应用于大数据分析和数据仓库操作。本实战数据集主要涉及两个核心部分:`video`数据和`user`数据,这些都是构建大数据分析模型的基础元素。让我们深入探讨一下...
44.复杂日志分析-指标结果的分析实现 45.Hive中数据文件的存储格式介绍及对比 46.常见的压缩格式及MapReduce的压缩介绍 47.Hadoop中编译配置Snappy压缩 48.Hadoop及Hive配置支持snappy压缩 49.Hive中的常见调优 50....
基于Hadoop网站流量日志数据分析系统 1、典型的离线流数据分析系统 2、技术分析 - Hadoop - nginx - flume - hive - mysql - springboot + mybatisplus+vcharts nginx + lua 日志文件埋点的 基于Hadoop网站流量...
读者可以使用Hive来处理和分析大量数据,包括日志数据、社交媒体数据和 IoT 数据等。同时,读者还可以使用Hive来实现数据挖掘、数据预处理和数据可视化等功能。 实践操作的重要性 实践操作是学习Hive和大数据分析...
基于Hadoop网站流量日志数据分析系统项目源码+教程.zip网站流量日志数据分析系统 典型的离线流数据分析系统 技术分析 hadoop nginx flume hive sqoop mysql springboot+mybatisplus+vcharts 基于Hadoop网站流量日志...
项目实践包括从安装CentOS开始,学习如何进行基本配置,到搭建和配置Hadoop、Spark、Kafka、Flume和Hive等大数据处理工具,直至实现一个完整的日志分析项目。 Hadoop是一个开源的分布式存储和计算框架,能够处理PB...
在HIVE实战测试中,数据通常来自各种来源,如日志文件、交易记录、社交媒体数据等。这些数据经过预处理后,被转化为Hive可识别的格式,如CSV或JSON,然后上传到HDFS(Hadoop分布式文件系统)中。测试数据的选择至关...
Hive 主要适用于离线分析,适合处理大量静态数据,如日志分析、用户行为分析、广告效果评估等。由于 Hive 的数据处理是批处理模式,不适合实时或低延迟查询。 【Hive 安装部署】 安装 Hive 包括准备 Hadoop 环境、...
例如,广告定向、用户行为分析、日志分析等业务都可以利用Hive进行大数据处理。 Hive的安装部署涉及配置Hadoop环境、安装Hive及其依赖(如Hadoop、Metastore Server、JDBC驱动等),然后设置环境变量和配置文件,...
在实际项目中,"Hive实战项目数据文件"通常包含了各种类型的数据集,这些数据可能来自于日志、传感器、用户行为等。数据文件可能以CSV、JSON或其他格式存储,Hive可以通过加载这些文件来建立表。在使用Hive时,我们...
Hive性能调优是一个复杂但关键的环节,涉及对Hive的参数配置以及针对应用程序的设计与开发进行优化。Hive是一个数据仓库基础工具,用于将结构化数据映射成数据库表,并通过HiveQL(简称HQL)查询语言执行数据处理...
3. **Hive日志系统实战.pdf**: 这份PDF可能详细讲解了Hive的日志管理和分析,这对于调试和性能优化至关重要。日志可以提供查询执行的详细信息,帮助我们理解查询执行的瓶颈和优化策略。用户可能会学习到如何配置和...
同时,也会介绍错误排查和日志分析,帮助读者解决Hive使用过程中可能遇到的问题。 总的来说,《Hive编程手册,从入门到精通》是一本全方位的Hive学习资源,涵盖了理论知识、实战技能和优化策略,无论你是初入大数据...
总的来说,本项目提供了一个综合性的用户画像分析框架,结合Spark的高性能计算能力和Hive的数据仓储优势,能够有效地处理和分析海量用户数据,为企业决策提供有力的数据支持。对于计算机专业学生来说,这样的项目...
《Spark大数据分析与实战》课程是一门深入探讨Apache Spark在大数据处理领域的应用和技术的课程,其课后练习答案集提供了对课程所讲授知识的巩固和实践。这是一份珍贵的配套教学资源,旨在帮助学生更好地理解和掌握...
这个压缩包文件"hive案列-游戏登陆信息分析.rar_hive.rar"显然是一个关于使用Hive进行游戏登录信息分析的实战案例,非常适合初学者进行学习和实践。下面我们将深入探讨Hive的相关知识,并结合游戏登录信息分析的场景...