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次请求。
推荐阅读
-
PHP数组无限分级数据的层级化处理代码
-
(求助)一个关于ACCESS数据库转化到MYSQL后的处理问题
-
求图纸形心的数据预处理与形心计算代码:输入多个矩形的坐标和长度宽度,计算它们的形心坐标
-
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据的思路详解
-
用php处理百万级以下的数据提高查询速度的方法
-
为什么数据分析一般用到java,而不是使用hadoop,flume,hive的api使用php来处理相关业务?
-
PHP处理二进制数据的实现方法,php处理二进制数据
-
为什么数据分析一般用到java,而不是使用hadoop,flume,hive的api使用php来处理相关业务?
-
千万级数据的情况下 mysql出现1040 在不改配置文件条件下 怎么处理?
-
第4章 数据处理-php数组的处理-郑阿奇_php入门_脚本之家