搜狐Pv insight(py)技术交流
- 4. 系统介绍 / 用户 关键字 : 响应用户 / 新用户 / 活跃用户 / 流失用户
- 6. 系统介绍 / sohu 企邮 一个企邮用户的连续访问 > 登入 > [ 管理此域 ] > 员工列表 > 广播邮件 * >>> ..... 一通点击 > 群组列表 > 新建群组 > 广播邮件 * > 发送 想发广播邮件的用户 想做了些什么?
- 7. 系统介绍 / sohu 企邮 如何发现 此类连续访问问题 ? 产物经理提出: 希望看到发“广播邮件”的用户都怎么时候 ? 从数据仓库中找出连续访问中 > 广播邮件 > 发送 ;之前的 操作 3. 并清洗数据为 离发送广播邮件最后 10 步 : > a_url 访问人数 ; > b_url 访问人数 离发送广播邮件最后 9 步 : > c_url 访问人数 > d_url 访问人数 …… .
- 10. 名词解释 Pv : page view 浏览次数 Uv : unique visitor 独立访客 Ip : 独立 Ip 数 新老访客 / 回头用户 / 会话次数 / 访问间隔 / 停留时长 / 访问深度 / 回访率 / 跳出率 / 入口率 计费方式 : cpc : 每次点击计费 cpm : 千次效果展现 计费 cpa : 用户行为计费 cps : 销售成本计费
- 11. 名词解释 现实是很残酷的 : 其实 UV 就很难算 ~ 我们的 UID 是一个 16 位的字符串 一般一个小小的统计就上亿条的记录 ( 16*8* (10**8) ) / ((2**10)**3) = 12 G
- 14. 系统架构 / 使用语言 Python ETL : 数据清洗 / 数据完整性 中间数据:结构维护(分时 / 治) / 统计 胶水 : c / r /mysql/ infob / bdb Java Hdfs / mapreduce / hbase Shell 调度 / 维护运行环境配置
- 16. Py 细节 / 预处理 / 数据完整性 url url => 栏目 ID ,频道 ID
- 17. Py 细节 / 预处理 / 数据完整性 url 域名 +url auto.sohu.com/ /20090914/n266706777.shtml 域名 auto.sohu.com/ 泛域名 i.auto.sohu.com/ 20090913/n237706498.shtml 特例 http://cs.focus.cn/news/2005-09-14/128510.html
- 18. Py 细节 / 预处理 / 数据完整性 url 存储 btree 需要匹配 url Key = domain 倒序 |url def pointerDrift_domain (self,domain,url,loop=10) : if loop < 0 : return ('0','0') dk2,dv2 = btree_url. previous() # next() dtype,ddmain,durl = dk2.split('|')[:3] if ddmain != domain : return ('0','0') if url.startswith( durl ) : return dv2.split('') else : return self. pointerDrift_domain (domain,url,loop-1)
- 19. Py 细节 / 预处理 / 数据完整性 url Btree key url moc.uhos.otua | / 20090913/n237706498.shtml moc.uhos.otua | moc.uhos.otua. i | /20090914/n266706777.shtml | = 174 特例 cs.focus.cn/news/2005-09-14/128510.html
- 20. Py 细节 / 预处理 / 数据清洗 流水线——预处理 0908251329265655 [26/Aug/2009:13:25:01 +0800] 123.15.49.138 "GET /pv.gif?t?=1251264295765164_1024_768?r?=http://www.sohu.com/ HTTP/1.1" "http://news.sohu.com/20090826/n266231388.shtml" pv.sohu.com CN4107 - - "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; QQDownload 570; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" iamyp78@sohu.com news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301 news.sohu.com 0908251329265655 20090826/n266231388.shtml 26/Aug/2009:13:25:01 0|2|1|1|iamyp78@sohu.com www.sohu.com CN2301 908251329265655 1252922376 900 /20090707/n265035120.shtml 11 / 0|2|1|1|iamyp78@sohu.com CN2301
- 21. Py 细节 / 预处理 / 数据清洗 Py 的一些特性正则 >>> re.findall( r’(?:ab)+’ , ’ababab abbabb aabaab’) 输出 : ['ababab'] >>> re.findall( ’/.*?/’ , ‘/* part 1 */ code /* part 2 */ ‘) 输出 : ['/* part 1 */', '/* part 2 */']???? ‘ (?<=…)’ 前向界定 , ‘(?=…)’? 后向界定 >>> s=r’/* comment 1 */? code? /* comment 2 */’ >>> re.findall( r’(?<=/).+?(?=/)’ , s ) [' comment 1 ', ' comment 2 '] # py 条件正则 大家请注意 。。。
- 22. Py 细节 / 预处理 / 数据清洗 合理使用正则
- 23. Py 细节 / 预处理 / 中间结果 / 分时分治
- 27. 计算 UV 好吧已经知道 UV 就很难算 ~ 我们先来看看 ,目前非常火的 Mapreduce 解决方案!
- 28. UV 计算, mapreduce 解决方案 目前我这里使用的, mapreduce 很粗暴!
- 29. UV 计算, mapreduce 解决方案 频道 1,SUV1 频道 2,SUV2 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 SUV1 频道 1 SUV1 频道 1 SUV2 频道 1 SUV3 频道 2 SUV1 频道 1 SUV1 频道 1 SUV1 频道 1 SUV2 频道 1 SUV3 频道 2 SUV1 频道 1,SUV1 频道 2,SUV2 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 SUV1 频道 1 SUV3 频道 1 SUV1 频道 1 SUV2 频道 2 SUV1 频道 1 SUV1 频道 1 SUV3 频道 1 SUV2 频道 2 SUV1
- 30. UV 计算, mapreduce 解决方案 频道 1,IP1,SUV1 频道 2, IP1,SUV2 频道 1, IP2,SUV3 频道 1 ‘SUV’ SUV1 频道 1 ‘IP’ IP1 频道 2 ‘SUV’ SUV2 频道 2 ‘IP’ IP1 频道 1 ‘SUV’ SUV3 频道 1 ‘IP’ IP2 … …
- 31. Py 细节 / 预处理 / 中间结果 / 分时分治 Python : marshal
- 32. UV 计算, python 解决方案 频道 1,SUV1 频道 2,SUV2 频道 1,SUV1 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 001001… 频道 2 100111 … 频道 1 110011… 频道 1 00100… 频道 1 0001010… 频道 2 1001000…
- 33. UV 计算, python 解决方案 频道 1,SUV1 频道 2,SUV2 频道 1,SUV1 频道 1,SUV3 频道 1,SUV1 频道 1,SUV2 频道 1 001001… 频道 2 100111 … 频道 1 110011… 频道 1 00100… 频道 1 0001010… 频道 2 1001000…
- 34. UV 计算, python 解决方案 现实又一次的残酷了! 我们的 UID 是一个 16 位的字符串 ~
- 35. UV 计算, python 解决方案 bc=bitarray() for n in xrange( 1000 ) : ????bc.extend(bitarray(10**6)) #120M f1=open('/tmp/bc1.ba','wa') bc.tofile(f1) # 我测试在 160k 左右 sio = StringIO() f2=open('/tmp/bc2.ba','wb') w = GzipFile('/tmp/bc3.ba','wb',9,sio) w.write(bc.tostring()) w.close()
- 37. UV 计算, python 调度 这么多任务 , 我们需要以个 .. 调度
- 39. Py 细节 / 调度 – 想象远没现实美好
- 40. Py 细节 / 胶水 R / rpy2 import rpy2.robjects as robjects r = robjects.r robjects.globalenv["x"] = robjects.FloatVector([1,2, 3, 4, 5, 6, 7, 8, 9, 10]) robjects.globalenv["y"] = robjects.FloatVector([0,30,44,57,65,78,68,97,99,120]) lm_d9 = r.lm("y ~ 1+x") r.predict( lm_d9, robjects.r(" data.frame(x=11) "), interval="prediction",level=0.95)[0] 输出 : 128.26666666666668
- 43. 数据的重要性 - 数据可视化 Yahoo Research 针对地震发生后一小时 twitter 相关微博数据研究
- 44. 数据的重要性 - 数据可视化 高转帖子的传播环: 二环为粉丝转发 5% , 三环为粉丝们的粉丝转发 55% , 四环是粉丝们的粉丝加泛粉丝 25% , 五环是随机粉丝 15% 。
- 46. 数据的重要性 - 数据可视化 twitter 上的 love 有关的关键词
- 47. 数据的重要性 - 数据可视化 twitter 上的 hate 有关的关键词
- 48. 数据的重要性 - 数据可视化 Yahoo Research 针对地震发生后一小时 twitter 相关微博数据研究
Editor's Notes
- #10: 1 正如哲学由最基本的三个问题引申出了很多 2 不同岗位、层级 对广度、深度和持久度要求不一样
- #17: 1 物以类聚、人以群分,具有相同特征的往往是一起的。 2 栏目由具有相同特征的若干 url 组成。 3 频道由具有相同特征的若干栏目组成,一个栏目可能属于多个频道
- #21: 第三点 1 python 全局锁的存在,导致使用多线程不如使用单进程来处理 2 节省空间,避免冗余,浪费资源; 减少服务器运算压力, 加快运算速度;相当于多了 9 台服务器 3 (可点击)将访问的 url 处理为 id , 加网址。 不存在的归为第 0 类。 对于 refer 是处理:搜狐内的为 id ,加网址,搜索引擎转化为关键字,其他转化为域名, www2 的转化为 www 的 4 uv 表面只少了一个 0 , 实际上市由字符串变为了整形,节省的空间意义重大。 当然为了记录一些的实际信息, 有些还是需要保存的。 例如来源
- #25: 1 5 分钟时,根据前面预处理的结果,计算 suv , pv , 并使用集合保留 suv 2 由于 python 的特性, 1 小时和 1 天只需简单加载数据进行归并即可 3 每周、每月
- #26: 1 人无远虑, 必有近忧 2 所谓分时处理就是将数据分摊到各时间片上进行处理 (翻页)
- #27: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #29: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #30: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #31: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #33: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #34: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #35: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #36: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #37: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #38: 第四点 1 全部数据拿来求交并、量太大 2 以奇偶进行讲解 3 对于频道数据 分 10 份存储,对于全站和各域数据分 50 份存储 4 使用多进程方式, 无锁交互
- #50: 1 知无不言、言无不尽 2 有请韩道亮同学上来和我一起回答大家的问题