知乎笔试(二)——日志处理

前言

由于和上一篇日志间隔较长,我尽力回忆,把当时解答的过程还原出来,越来越讨厌CSDN的博客了,神马玩意啊,个人profile下面都插一个广告栏,弃用是迟早的事。
附上我的知乎: http://www.zhihu.com/people/liu-shuai-82

题目内容


呃,拿到题目之后着实思考了一会,主要是思考各种处理方法的效率问题。后来又去搜索了一下业界这种数据处理的通用方式以及注意事项,基本上这种大数据的处理要用Hash。后来我确定了方法:
按天遍历每一条日志记录,为每一天创建一个临时文件,在内存中用用户id作为key,对应的“/topic/***”访问路径作为value。每遍历到一条访问路径是“/topic/***”的记录,判断内存中的hash表中是否已经有该条日志用户的id,有的话判断该id在hash表中的value——topic的路径与当前读到的日志记录的topic路径是否相同,如果不同的话,将id写到这一天对应的临时文件中。
上面的过程处理完毕之后,我们得到了30个临时文件,每个临时文件记录了一些用户的id,这些用户满足:在该天内,访问的“/topic/***”路径中,包含两个不同的路径。然后我们要做的是从这30个临时文件中找出一些id,它们在每个文件中都出现过。这些ID就是我们的最终结果。
后面一问,找出一个路径列表,用类似的hash处理方式即可。
按着这样的思路,不难写出代码:
import sys, re, os

re_exp_1 = re.compile('\[.+\] (\d+) \d+ [A-Za-z]+ /topic/(\d+) \(((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)\) [\d\.]+[a-zA-Z]+')
re_exp_2 = re.compile('\[.+\] (\d+) \d+ [A-Za-z]+ ([/a-zA-Z\d]+) \(((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)\) [\d\.]+[a-zA-Z]+')

def get_id_topic_path(log_line):
	'''
	return the uid and the subpath of topic via a tuple if match.
	'''
	m = re_exp_1.match(log_line
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值