龙门飞甲快播:搜狗搜索日志分析 2024-04-25 02:34:35 0 0 1. 概述 本文利用搜狗搜索日志的500w条数据,对搜索日志进行了一系列的分析。主要分为两个阶段,第一阶段是数据准备、数据预处理和数据加载阶段,第二阶段为分析阶段。 第一阶段首先下载数据,并在自己电脑上安装好实验所需的环境,然后通过数据扩展和数据过滤对原数据进行预处理,得到含有单独年、月、日、小时等字段且关键词和UID不为空的数据,最后将数据加载到HDFS上,并在Hive上创建数据库和数据表,将过滤后的数据灌入Hive中对应的表中,因而后续便可以通过在Hive中执行SQL语句对日志数据进行查询分析。 第二阶段为分析阶段,也分为两部分,一部分是单维度的数据描述性分析,另一部分时多维度的用户行为分析。在单维度的数据描述行分析中,分别针对总的条数、时间、关键词、UID、URL、RANK等单个的字段进行描述统计,例如对每个时间段的查询条数、关键词搜索排行榜、UID搜索排行榜、URL搜索排行榜等进行了查询统计,从而对数据有了一个大概的全局的把握;在多维度的用户行为分析中,以查询最多的用户、点击最多的网址、指定的关键词等为切入点进行深入的用户行为分析,例如在对查询最多的用户的用户行为分析中,通过其搜索的关键词及其频次,得到其目前的兴趣点等,通过其在每个时段的搜索次数,得到其大致的时间行为规律,这对于理解用户行为,描述用户画像,从而定向地针对性地进行广告推荐都是有一定的意义的。 2. 数据准备 2.1 实验环境 Cloudera QuickStart VM将包含所需的所有内容,例如CDH,Cloudera Manager,Cloudera Impala和Cloudera Search等,还包括教程,示例数据和入门脚本。Cloudera QuickStart虚拟机(单节点集群)可以轻松快速地进行CDH实验,以便进行测试,演示和自学,并包括Cloudera Manager以管理您的集群。 本文的使用的Cloudera QuickStart VM的版本是: Cloudera-quickstart-vm-5.5.0-0-virtualbox 操作系统:Red Hat (64 bit) 内存大小:4096MB 处理器:2 所使用的virtualbox的版本是:VirtualBox-4.3.12-93733-Win Cloudera QuickStart VM开启后的截图如下: Hive查询操作页面截图如下: 2.2 数据描述 本文选取搜狗实验室提供的搜狗搜索日志数据,共计五百万条,每一行为一条记录,每条记录基本上含有ts、uid、rank、order、url等字段,字段的具体意义如表1所示。 表1 搜索日志中的内容 名称 内容 ts 用户点击发生时的日期时间 uid 由系统自动分配的用户识别号 rank 该URL在返回结果中的排名 order 用户点击的顺序号 url 用户点击的URL 其中,UID是根据用户使用浏览器访问搜索引擎时的Cookie信息自动赋值,即同一次使用浏览器输入的不同查询对应同一个用户识别号。 3. 数据预处理 3.1 数据扩展 将原数据中包含时间的字段拆分并拼接,添加年、月、日、小时字段,以便后续在HDFS中进行分块存储。分割时间字段的shell脚本sogou-log-extend.sh的具体代码如下: #!/bin/bash infile=$1 outfile=$2 awk -F '\t' '{print $0"\t"substr($1,0,4)"\t"substr($1,4,2)"\t" substr($1,6,2)"\t"substr($1,8,2)}' $infile > $outfile 在终端执行此shell脚本: [cloudera@quickstart ~]$ bash /home/cloudera/sogou-log-extend.sh /home /cloudera/500w/sogou.500w.utf8 /home/cloudera/500w/sogou.500w.utf8.ext 则sogou.500w.utf8.ext文件即为在原数据的基础上添加年、月、日、小时字段的文件。 3.2 数据过滤 完成数据扩展后,然后过滤UID和keyword字段为空的记录。数据过滤的shell脚本sogou-log-filter.sh的具体代码如下: #!/bin/bash infile=$1 outfile=$2 awk -F "\t" '{if($2 != "" && $3 != "" && $2 != " " && $3 != " ") print $0}' $infile > $outfile 在终端执行此shell脚本: [cloudera@quickstart ~]$ bash /home/cloudera/sogou-log-filter.sh /home /cloudera/500w/sogou.500w.utf8.ext /home/cloudera/500w/sogou.500w.utf8. flt 则sogou.500w.utf8.flt即为过滤后的数据文件。 3.3 数据加载 将原数据文件sogou.500w.utf8和过滤后的数据文件sogou.500w.utf8.flt加载到HDFS上。在系统终端执行如下代码: hadoop fs -mkdir -p /sogou/20111230 hadoop fs -put ./sogou.500w.utf8 /sogou/20111230 hadoop fs -mkdir -p /sogou_ext/20111230 hadoop fs -put ./sogou.500w.utf8.flt /sogou_ext/20111230 由此,已将数据加载到HDFS系统中,然后在Hive上创建日志数据的数据表。 首先在终端启动hive,在hive环境下创建数据库sogou: hive> create database sogou; hive> use sogou; 然后,创建扩展4个字段(year, month, day, hour)数据的外部表: hive> CREATE EXTERNAL TABLE sogou.sogou_ext_20111230( > ts STRING, > uid STRING, > keyword STRING, > rank INT, > order INT, > url STRING, > year INT, > month INT, > day INT, > hour INT > ) > COMMENT 'This is the sogou search data of extend data' > ROW FORMAT DELIMITED > FIELDS TERMINATED BY '\t' > STORED AS TEXTFILE > LOCATION '/sogou_ext/20111230'; 创建带分区的表: hive> CREATE EXTERNAL TABLE sogou.sogou_partition( > ts STRING, > uid STRING, > keyword STRING, > rank INT, > order INT, > url STRING > ) > COMMENT 'This is the sogou search data by partition' > partitioned by ( > year INT, > month INT, > day INT, > hour INT > ) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY '\t' > STORED AS TEXTFILE; 最后,把HDFS中的数据灌入到刚刚创建的表中: hive> set hive.exec.dynamic.partition.mode=nonstrict; hive> INSERT OVERWRITE TABLE sogou.sogou_partition PARTITION(year,month, day,hour) select * from sogou.sogou_ext_20111230; 到现在为止,已把经过预处理的数据加载到hive中,后续便可以在hive中执行SQL语句进行查询分析。 4. 单维度数据描述性分析 4.1 条数统计 查看前10条数据: hive> select * from sogou.sogou_ext_20111230 limit 10; 前10条数据的具体信息如下: 查询数据的总条数: hive> select count(*) from sogou.sogou_ext_20111230; 查询非空查询条数: hive> select count(*) from sogou.sogou_ext_20111230 where keyword is not null and keyword !=''; 查询无重复总条数(根据ts、uid、keyword、url) hive> select count(*) from (select ts,uid,keyword,url,count(*) as cnt from sogou.sogou_ext_20111230 group by ts,uid,keyword,url) a where a.cnt==1; 查询UID唯一的条数: hive> select count(distinct(uid)) from sogou.sogou_ext_20111230; 可知,(a) 本数据文件中共包含500万条数据; (b) 非空查询条数为5000000条,即所有的数据的keyword都不为空; (c) 以ts、uid、keyword、url字段作为判断记录是否重复的标准,得到的无重复总条数为4998321条; (d) UID唯一的条数共有1352664条,即在此段时间内共有1352664个用户进行来搜狗搜索。 4.2 时间分析 查询每个时间段查询的条数: hive> select year,month,day,hour,count(*) as cnt from sogou.sogou_ext_20111230 group by year,month,day,hour order by year,month,day,hour; 得到的结果如下: time cnt time cnt 2011123000 90752 2011123017 289648 2011123001 65702 2011123018 295207 2011123002 45880 2011123019 340115 2011123003 34242 2011123020 353099 2011123004 27922 2011123021 328949 2011123005 28213 2011123022 270842 2011123006 32988 2011123023 194554 2011123007 52832 2011123100 64 2011123008 165616 2011123101 5 2011123009 279104 2011123102 1 2011123010 315973 2011123103 2 2011123011 276103 2011123104 2 2011123012 274234 2011123106 3 2011123013 295936 2011123109 1 2011123014 306242 2011123116 2 2011123015 318645 2011123120 2 2011123016 317120 根据上面的得到的数据,绘制2011年12月30日这一天各时间段的查询条数的条形图如下: 可知,(a) 2011年12月30日这一天中共有4999918条,而2011年12月31日仅有82条,可能本数据集中采集的12月31日的数据不全; (b) 在2011年12月30日这一天中,0-4时的的查询次数逐渐减少,到4时达到最低,然后慢慢上升,特别在7-9时的增加特别显著,到9-10时逐渐趋于稳定,每个小时大概有300000次查询,到21时后查询次数开始减少。基本符合人们的作息时间; (c) 在查询次数稳定的时间段内,即9-21时,中间有两次低谷,分别在11-12、17-18,这可能是因为此时间段是人们的中饭、晚饭时间,所以表现出查询次数的略微减少。 4.3 关键词分析 查询关键词的长度指的是用户提交的查询中包含几个词语或字(用空格隔开的)。 查询关键词的平均长度: hive> select avg(a.cnt) from (select size(split(keyword,'\\s+')) as cnt from sogou. sogou_ext_20111230) a; 可知查询关键词的平均长度为1.0869984,这说明用户输入的查询通常比较短,这也意味着中文搜索引擎得到的用户需求信息更少,需要对用户需求有更多的分析和经验,才能更加准确地返回用户需求的信息。 查询关键词各长度的条数: hive> select a.cnt,count(*) as total from( select uid,size(split(keyword, '\\s+')) as cnt from sogou.sogou_ext_20111230) a group by a.cnt order by a.cnt; 得到的结果如下: a.cnt total a.cnt total a.cnt total 1 4672047 11 175 21 10 2 260746 12 125 22 6 3 48424 13 82 23 11 4 11359 14 50 26 14 5 3288 15 38 27 3 6 1522 16 33 31 6 7 859 17 24 32 3 8 506 18 41 36 1 9 328 19 8 45 1 10 263 20 27 图表表示如下: 可知,(a) 查询关键词的长度最短为1个词,最长为45个词; (b) 关键词长度为1的条数为4672047条,关键词长度为2的条数为260746,关键词长度为3的条数为48424,关键词长度为4的条数为11359条,关键词长度为5的条数为3288,关键词长度为6的条数为1522,而关键词长度大于6的条数低于1000条,关键词长度大于12的条数低于100条,关键词长度为36、45的条数仅为1条; (c) 查询关键词长度为1的条数占总查询条数的93.44%,查询关键词长度为2的条数占5.21%,即查询关键词的长度小于等于2的条数为98.65%,几乎占据了所有的查询条数,这也再次说明了用户的查询关键词长度一般为1-2个词,与上面得到的查询关键词平均长度为1.087相符; (d) 从图中也可以看出,关键词长度为1的条数远大于关键词长度为2的条数,可知,大多数查询还是只用一个关键词。 查询查询频度最高的前1000词: hive> select keyword,count(*) as cnt from sogou.sogou_ext_20111230 group by keyword order by cnt desc limit 1000; 得到的部分结果如下(截取前50): keyword cnt keyword cnt 百度 38441 龙门飞甲 3917 baidu 18312 qq个性签名 3880 人体艺术 14475 张去死 3848 4399小游戏 11438 cf官网 3729 qq空间 10317 凰图腾 3632 优酷 10158 快播 3423 新亮剑 9654 金陵十三钗 3349 馆陶县县长闫宁的父亲 9127 吞噬星空 3330 公安卖萌 8192 dnf官网 3303 百度一下 你就知道 7505 武动乾坤 3232 百度一下 7104 新亮剑全集 3210 4399 7041 电影 3155</ 收藏(0)