Hive處理資料的頭腦風暴

2021-09-01 15:59:22 字數 1598 閱讀 7743

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項原則

在大多數公司中,讓我們來頭腦風暴吧 一般是指 讓我們現在到辦公室裡坐下,聊上乙個小時看看能否扔出一些針對性的解決問題的主意和辦法 這意味著我們必須圍繞面臨的問題進行時間性思考,必須用盡腦力,從盡可能多的角度去思考問題並想出盡可能多的不同解決方法。不論時間有多不足,房間裡的頭腦們會擠壓出盡可能多的頭腦...