Hive处理数据的头脑风暴

Hive虽然强大,但是我们遇到的业务需求必定是千奇百怪的。

往往在数据库中,通过游标来实现的数据读取,再回代到绑定变量的SQL里面进行查询在Hive时代已经不复存在。

 

举个例子,解析用户最近一年产品购买的金额。时间日期按照最近一次购买倒推一年。

原本我在Oracle数据库里面是通过游标+SQL绑定回查完成的。

 

现在用Hive,我觉得应该这么写:

select user_id,sum(pay_amount)
from(
select a.user_id,a.pay_amount,a.pay_date, b.last_pay_date
from src_tbl a 
left outer join (
    select user_id, min(pay_date) last_pay_date from src_tbl 
    group by user_id
    ) b
where a.pay_date > b.last_pay_date - 1 year
)group by user_id

 思路是,如果一个表的数据会互相关联,

则需要将处理好的结果集,关联到原来的表上面,作为条件的一部分。

 

那么在做日志解析的时候,我们会遇到访客,和访次的概念。

对于在2个小时之内的访问,我们认为是访问一次,对于两个小时之外的访问,我们认定是再次访问。

也就是是说,最新一次访问,与上一次访问之间间隔超过2个小时,则算是第二次访问。

用Hive来做过滤。

 

理一下思路:

select cookie_id, min(visit_time)

from web_log

group by cookie_id

用上面的计算来求出每个Cookie的第一次访问。

然后把这个访客的第一次访问的数据清理出来

 

select *

from web_log a

left outer join (

select cookie_id, min(visit_time) first_visit

from web_log

group by cookie_id

) b

on a.cookie_id = b.cookie_id

where a.visit_time > first_visit + 2 hours

 

这样就取出了一些第二次访问的客户数据了。

重复5-6次。

这样就可以计算出到底有多少防次访问了网站。

虽然不一定是最优解,不知道还有没有更好的办法呢??

 

想到一个方法,在Reduce阶段,用Distribute By cookie_id。

然后使用Python脚本进行编程。

取一条登陆记录,取其访问的时间。用变量保存。

然后再取一条记录,

如果新的记录的访问时间与上一次的访问记录相差2个小时,则输出上一条记录。

如果在2个小时之内,更新变量,不输出,继续访问。这样就像是个游标一样处理数据。

 

最后将输出格式为 cookie_id,first_visit_time,last_visit_time这样的格式,每一条这样的记录作为一次的访问。这一次访问包含N次请求。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值