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
) bwhere 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
) bon 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次請求。
失眠的頭腦風暴
今晚失眠。想著未來的生活 以後的職業方向,就無心睡眠。只知道還要繼續努力,但沒有方向 目標的努力成長是非常緩慢的,而且會浪費很多精力和時間在看似有用實際卻沒有的事情上。畢業四年,辛苦換來了基層管理者的角色,這也是我以前所希望的。高中十幾年,沒學到什麼東西,只知道只要努力,很多事我也可以做的事很好,只...
「讓我們來頭腦風暴吧」,頭腦風暴會的10項原則
在大多數公司中,讓我們來頭腦風暴吧 一般是指 讓我們現在到辦公室裡坐下,聊上乙個小時看看能否扔出一些針對性的解決問題的主意和辦法 這意味著我們必須圍繞面臨的問題進行時間性思考,必須用盡腦力,從盡可能多的角度去思考問題並想出盡可能多的不同解決方法。不論時間有多不足,房間裡的頭腦們會擠壓出盡可能多的頭腦...
頭腦風暴會的10項原則
在大多數公司中,讓我們來頭腦風暴吧 一般是指 讓我們現在到辦公室裡坐下,聊上乙個小時看看能否扔出一些針對性的解決問題的主意和辦法 這意味著我們必須圍繞面臨的問題進行時間性思考,必須用盡腦力,從盡可能多的角度去思考問題並想出盡可能多的不同解決方法。不論時間有多不足,房間裡的頭腦們會擠壓出盡可能多的頭腦...