hive表結構例如以下:
create table pv_user_info(
session_id string,
user_id string,
url string,
starttime bigint
);
主要就是這幾個字段實用。省略其它。
實現方式:userid和sessionid分組後並按時間降序排序,降序排序後。第一行就是該使用者最後一次瀏覽的網頁。最後一行是第一次瀏覽的網頁,第一行的starttime和第二行的starttime相減就是第二行停留時間。
這裡會有幾個誤差
使用者最後一次瀏覽的網頁時長:由於不知道用關閉瀏覽器的時間。所以沒辦法計算,就返回乙個特定的值吧,我這裡返回的是0。
跨天:任務是按天統計,還沒有第二天的資料,所以不考慮跨天。
連續點開多個網頁:按上面的實現方式就會有誤差。這是沒辦法的。
按產生日誌檔案的結果看。僅僅能用這樣的實現方式,除非專門寫個js記錄網頁停留時長(不知是否可行),那麼就不須要用hive了。
詳細實現:
1.要實現行與行之間的比較或算加減法hive sql是實現不了的,僅僅有自己定義函式udf
2.定義全域性變數,存上次瀏覽時間。sessionid。userid
3.第一次呼叫evaluate方法上次瀏覽時間肯定是空的。也就是說是使用者在這一天裡最後一次瀏覽網頁的時間,直接返回0即可了。
4.再次呼叫evaluate方法要推斷是不是同上一次呼叫evaluate方法是不是同乙個使用者同乙個會話。假設是的話就相減。
5.呼叫evaluate方法假設和上一次呼叫不是乙個使用者。說明這個網頁是還有乙個使用者最後一次瀏覽網頁的時間。直接返回0。
hiveudf**
import org.apache.hadoop.hive.ql.exec.udf;
public class calcudf extends udf
return 0l;
} else
return usetime;
} else
return 0l;
}} }
}
將**打成jar包。上傳到/home/hadoop/test/
進入hive命令列,執行:
add jar /home/hadoop/test/hiveudf.jar; // 加入jar包
create temporary function calc as 'com.orange.hadoop.calcudf'; //建立函式
//最後執行hive sql
select session_id,user_id,url,starttime,
calc(starttime,user_id,session_id)
from
(select * from pv_user_info distribute by user_id,session_id sort by user_id,session_id ,starttime desc) t;
這是我的實現方式。有沒有更好的解決方式?
hive計算網頁停留時長
hive表結構例如以下 create table pv user info session id string,user id string,url string,starttime bigint 主要就是這幾個字段實用。省略其它。實現方式 userid和sessionid分組後並按時間降序排序,降...
統計頁面停留時間計算
一 頁面停留時間與 停留時間是如何計算出來的?我們想要知道的是 假如這個使用者從10 00開始訪問 對於page2而言,訪問時間是10 05 10 01,即4分鐘。接著訪問者來到了page3頁面,他發現改頁面無法滿足他的需求或是他要找的內容已在page3頁面找到。那麼接下來就是離開。那麼,這個訪問者...
PowerShell限制計算機使用時長
前兩天中午吃飯的時候,同事問在windows 下有沒有什麼辦法可以限制使用者使用計算機的時長,比如超過兩個小時,則不允許繼續使用,另一同事說網上有很多類似的軟體啊,超時了則不允許其繼續上網,同事說是想限制其不能再繼續使用計算機。我問是不是想限制你兒子玩遊戲啊,他說是。我想了想說這個不難,我給你寫個指...