Hive 分析函數(shù)lead桑包、lag實例應用

Lag和Lead分析函數(shù)可以在同一次查詢中取出同一字段的后N行的數(shù)據(jù)(Lag)和前N行的數(shù)據(jù)(Lead)作為獨立的列湾趾。

這種操作可以代替表的自聯(lián)接绽昼,并且LAG和LEAD有更高的效率唯鸭,其中over()表示當前查詢的結(jié)果集對象,括號里面的語句則表示對這個結(jié)果集進行處理硅确。

1 LEAD

與LAG相反目溉,LEAD(col,n,DEFAULT) 用于統(tǒng)計窗口內(nèi)往下第n行值

參數(shù)1為列名,參數(shù)2為往下第n行(可選菱农,默認為1)缭付,參數(shù)3為默認值(當往下第n行為NULL時候,取默認值循未,如不指定陷猫,則為NULL)

場景

用戶Peter在瀏覽網(wǎng)頁,在某個時刻只厘,Peter點進了某個頁面烙丛,過一段時間后,Peter又進入了另外一個頁面羔味,如此反復河咽,那怎么去統(tǒng)計Peter在某個特定網(wǎng)頁的停留時間呢,又或是怎么統(tǒng)計某個網(wǎng)頁用戶停留的總時間呢赋元?

create table test.user_log(
    userid string,
    time string,
    url string
) row format delimited fields terminated by '\t';

使用load命令將如下測試數(shù)據(jù)導入:

Peter   2015-10-12 01:10:00 url1
Peter   2015-10-12 01:15:10 url2
Peter   2015-10-12 01:16:40 url3
Peter   2015-10-12 02:13:00 url4
Peter   2015-10-12 03:14:30 url5
Marry   2015-11-12 01:10:00 url1
Marry   2015-11-12 01:15:10 url2
Marry   2015-11-12 01:16:40 url3
Marry   2015-11-12 02:13:00 url4
Marry   2015-11-12 03:14:30 url5

數(shù)據(jù)說明:Peter 2015-10-12 01:10:00 url1 忘蟹,表示Peter在2015-10-12 01:10:00進入了網(wǎng)頁url2,即記錄的是進入網(wǎng)頁的時間搁凸。

分析

要計算Peter在頁面url1停留的時間媚值,需要用進入頁面url2的時間,減去進入url1的時間护糖,即2015-10-12 01:15:10這個時間既是離開頁面url1的時間褥芒,也是開始進入頁面url2的時間。

獲取用戶在某個頁面停留的起始與結(jié)束時間:

select userid,
time stime,
lead(time) over(partition by userid order by time) etime,
url 
from test.user_log;

stime就是進入頁面時間,etime就是離開頁面時間锰扶,結(jié)果是這樣的:

Marry   2015-11-12 01:10:00 2015-11-12 01:15:10 url1
Marry   2015-11-12 01:15:10 2015-11-12 01:16:40 url2
Marry   2015-11-12 01:16:40 2015-11-12 02:13:00 url3
Marry   2015-11-12 02:13:00 2015-11-12 03:14:30 url4
Marry   2015-11-12 03:14:30 NULL    url5
Peter   2015-10-12 01:10:00 2015-10-12 01:15:10 url1
Peter   2015-10-12 01:15:10 2015-10-12 01:16:40 url2
Peter   2015-10-12 01:16:40 2015-10-12 02:13:00 url3
Peter   2015-10-12 02:13:00 2015-10-12 03:14:30 url4
Peter   2015-10-12 03:14:30 NULL    url5

用etime減去stime献酗,然后按照用戶分組累加就是,每個用戶訪問的總時間了坷牛。

select userid,
time stime,
lead(time) over(partition by userid order by time) etime,
UNIX_TIMESTAMP(lead(time) over(partition by userid order by time),'yyyy-MM-dd HH:mm:ss')- UNIX_TIMESTAMP(time,'yyyy-MM-dd HH:mm:ss') period,
url 
from test.user_log;

這里展示出了stime(開始時間)罕偎,etime(離開時間),period(停留時長)京闰,url(頁面地址)颜及,結(jié)果:

Marry   2015-11-12 01:10:00 2015-11-12 01:15:10 310 url1
Marry   2015-11-12 01:15:10 2015-11-12 01:16:40 90  url2
Marry   2015-11-12 01:16:40 2015-11-12 02:13:00 3380    url3
Marry   2015-11-12 02:13:00 2015-11-12 03:14:30 3690    url4
Marry   2015-11-12 03:14:30 NULL    NULL    url5
Peter   2015-10-12 01:10:00 2015-10-12 01:15:10 310 url1
Peter   2015-10-12 01:15:10 2015-10-12 01:16:40 90  url2
Peter   2015-10-12 01:16:40 2015-10-12 02:13:00 3380    url3
Peter   2015-10-12 02:13:00 2015-10-12 03:14:30 3690    url4
Peter   2015-10-12 03:14:30 NULL    NULL    url5
  • 這里有空的情況,也就是沒有獲取到離開時間蹂楣,這要看實際業(yè)務怎么定義了俏站,如果算到23點,太長了痊土。

2 Lag

LAG(col,n,DEFAULT) 用于統(tǒng)計窗口內(nèi)往上第n行值第一個參數(shù)為列名乾翔,第二個參數(shù)為往上第n行(可選,默認為1)施戴,第三個參數(shù)為默認值(當往上第n行為NULL時候反浓,取默認值,如不指定赞哗,則為NULL)可以用來做一些時間的維護雷则,如上一次登錄時間。

場景

用戶Peter在瀏覽網(wǎng)頁肪笋,在某個時刻月劈,Peter點進了某個頁面,過一段時間后藤乙,Peter又進入了另外一個頁面猜揪,如此反復,那怎么去統(tǒng)計Peter在某個特定網(wǎng)頁的停留時間呢坛梁,又或是怎么統(tǒng)計某個網(wǎng)頁用戶停留的總時間呢而姐?

create table test.user_log(
    userid string,
    time string,
    url string
) row format delimited fields terminated by '\t';

使用load命令將如下測試數(shù)據(jù)導入:

Peter   2015-10-12 01:10:00 url1
Peter   2015-10-12 01:15:10 url2
Peter   2015-10-12 01:16:40 url3
Peter   2015-10-12 02:13:00 url4
Peter   2015-10-12 03:14:30 url5
Marry   2015-11-12 01:10:00 url1
Marry   2015-11-12 01:15:10 url2
Marry   2015-11-12 01:16:40 url3
Marry   2015-11-12 02:13:00 url4
Marry   2015-11-12 03:14:30 url5

數(shù)據(jù)說明:Peter 2015-10-12 01:10:00 url1 ,表示Peter在2015-10-12 01:10:00進入了網(wǎng)頁url2划咐,即記錄的是進入網(wǎng)頁的時間拴念。

select userid,
time etime,
lag(time, 1, '1970-01-01 00:00:00') over(partition by userid order by time) stime,
url 
from test.user_log;

這里etime是結(jié)束時間,stime是開始時間褐缠,結(jié)果:

Marry   2015-11-12 01:10:00 1970-01-01 00:00:00 url1
Marry   2015-11-12 01:15:10 2015-11-12 01:10:00 url2
Marry   2015-11-12 01:16:40 2015-11-12 01:15:10 url3
Marry   2015-11-12 02:13:00 2015-11-12 01:16:40 url4
Marry   2015-11-12 03:14:30 2015-11-12 02:13:00 url5
Peter   2015-10-12 01:10:00 1970-01-01 00:00:00 url1
Peter   2015-10-12 01:15:10 2015-10-12 01:10:00 url2
Peter   2015-10-12 01:16:40 2015-10-12 01:15:10 url3
Peter   2015-10-12 02:13:00 2015-10-12 01:16:40 url4
Peter   2015-10-12 03:14:30 2015-10-12 02:13:00 url5

計算總時間政鼠,只需要用結(jié)束時間 - 開始時間,然后分組累加即可队魏。

select userid,
UNIX_TIMESTAMP(time, 'yyyy-MM-dd HH:mm:ss') - 
UNIX_TIMESTAMP(lag(time, 1, '1970-01-01 00:00:00') over(partition by userid order by time), 'yyyy-MM-dd HH:mm:ss'),
url 
from test.user_log;

結(jié)果

Marry   1447290600  url1
Marry   310 url2
Marry   90  url3
Marry   3380    url4
Marry   3690    url5
Peter   1444612200  url1
Peter   310 url2
Peter   90  url3
Peter   3380    url4
Peter   3690    url5

因為有兩個我將默認值置為了1970-01-01公般,所以算出來比較大,實際工作中需要按照實際情況處理。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末官帘,一起剝皮案震驚了整個濱河市蟹略,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遏佣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揽浙,死亡現(xiàn)場離奇詭異状婶,居然都是意外死亡,警方通過查閱死者的電腦和手機馅巷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門膛虫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钓猬,你說我怎么就攤上這事稍刀。” “怎么了敞曹?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵账月,是天一觀的道長。 經(jīng)常有香客問我澳迫,道長局齿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任橄登,我火速辦了婚禮抓歼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拢锹。我一直安慰自己谣妻,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布卒稳。 她就那樣靜靜地躺著蹋半,像睡著了一般。 火紅的嫁衣襯著肌膚如雪充坑。 梳的紋絲不亂的頭發(fā)上湃窍,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音匪傍,去河邊找鬼您市。 笑死,一個胖子當著我的面吹牛役衡,可吹牛的內(nèi)容都是我干的茵休。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼榕莺!你這毒婦竟也來了俐芯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钉鸯,失蹤者是張志新(化名)和其女友劉穎吧史,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唠雕,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贸营,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩睁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞脂。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捕儒,靈堂內(nèi)的尸體忽然破棺而出冰啃,到底是詐尸還是另有隱情,我是刑警寧澤刘莹,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布阎毅,位于F島的核電站,受9級特大地震影響点弯,放射性物質(zhì)發(fā)生泄漏净薛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一蒲拉、第九天 我趴在偏房一處隱蔽的房頂上張望肃拜。 院中可真熱鬧,春花似錦雌团、人聲如沸燃领。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猛蔽。三九已至,卻和暖如春灵寺,著一層夾襖步出監(jiān)牢的瞬間曼库,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工略板, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毁枯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓叮称,卻偏偏與公主長得像种玛,于是被迫代替她去往敵國和親藐鹤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容