- 注册时间
- 2013-3-14
- 最后登录
- 2016-3-31
- 阅读权限
- 90
- 积分
- 3200
- 精华
- 0
- 帖子
- 545
TA的每日心情 | 怒 2016-3-31 23:45 |
---|
签到天数: 64 天 连续签到: 1 天 [LV.6]常住居民II
|
大网站有大网站的好处——数据极其之丰富;大网站也有大网站的坏处——数据处理极其之麻烦。处理海量数据至今也算略有些经验了,稍总结下:
1. 数据简化
这里的“数据简化”,指的是采用相对更容易计算的数据指标。比如说两个最常用指标:UV与Visits(此处定义为类似于服务器日志里面的单条数据),因为两者数值接近、趋势一般情况下等同,所以对于SEO流量的多数分析,两个指标都可以。
但在大规模数据处理中,通常一开始的原始数据是Visits,需要通过user的id来排序等计算非常耗时的步骤,才能计算出UV。所以一般情况下,UV没必要去额外计算。
2. 数据精简
对于一个大网站,一天几十几百G的数据是不奇怪的。如此庞大的数据,定时生成报表或还能实现,但已经不太可能用作及时性的分析了。所以需要将数据的体积最小化。
比如说只需要去除后续访问的SEO流量数据,它在总流量数据中的占比往往是很小的,立马一大堆数据就精简了。然后SEO流量还可以继续精简,比如User-Agent、请求文件大小等数据往往不需要;Referer也没必要完整存下来,可以只提取出其中的来源关键词等信息。
这样精简下来,原来一天几十几百G的文件,就变成一天几十几百M的文件了,哪怕一台小VPS都能撑得住。
3. 基础数据分析
如果单条grep命令能搞定分析需求的话,它往往是个很理想的解决方案。活用^$等,可以精确匹配到预计的字段。
用grep分析的前置需求是,数据必须被分隔成一个个小文件(通常按日分隔),不然计算效率会极慢。
4. top-n数据分析
top-n,简言之就是流量最高的100个页面、流量最高的100个关键词之类的。Python可以比较简单的完成这个工作,且内置堆排序算法(top-n的高效计算算法);Ruby可以用比Python还少的代码量完成前半段工作,但内置的排序算法比较少,堆排序还要到其它地方找。
我的大致代码是,创建个hash表,key为关键词、URL之类的,value来计数。遍历数据文件的每一行,看到不符合要求的数据,continue。最终侥幸没有被continue掉的那部分数据,就往hash表去计数。最终排序下,就得到想要的结果了。代码行数也挺少。
|
|