前幾天接到以需求,要求計算玩家的連勝&連敗紀錄,資料sample如下:
源資料的表結構如下:
create table `t1`(
`id` bigint,
`player_id` int,
`game_result` int,
`season` int,
`game_type` int)
row format delimited
fields terminated by '\t';
資料檔案如下:
id:表示比賽id
player_id:使用者id
game_result:比賽結果,0代表輸,1代表贏
idplayer_id
game_result
112312
1231
3321
0使用python編寫udf如下:
python檔名:
win_streak_reduce.py
#! /usr/bin/python
import sys
for line in sys.stdin:
line = line.split('\t')
player_id = line[0]
games = [int(i) for i in line[1].split(',')]
win_streak_max = 0
lost_streak_max = 0
win_tmp = 0
lost_tmp = 0
for i in games:
if i == 1:
lost_tmp = 0
win_tmp += 1
else:
lost_tmp += 1
win_tmp = 0
if win_tmp > win_streak_max:
win_streak_max = win_tmp
if lost_tmp > lost_streak_max:
lost_streak_max = lost_tmp
print "\t\t".format(player_id = player_id, win_streak_max = win_streak_max, lost_streak_max = lost_streak_max)
最後查詢:
add file /win_streak_reduce.py;
select transform(player_id,games) using 'python win_streak_reduce.py' as player_id,win_streak,lost_streak from (select player_id,concat_ws(',',collect_list(cast(game_result as string))) games from (select player_id,id, game_result from t1 cluster by player_id,id) t group by player_id) t;
整體思路是:
1. 將比賽記錄按照player_id,id排序,hql中的cluster by player_id,id,會使同乙個player_id的資料被分發到一起處理。
2. concat_ws(',',collect_list(cast(game_result as string)))會把玩家的比賽結果按照id從小打到排成陣列,最後轉成字串,用,分隔
3. 使用udf對比賽結果進行計算,找出連勝和連敗最大值。
分析函式hive計算均值 Hive 分析函式
應用場景 1 用於分割槽排序 2 top n 3 層次查詢 常用分析函式 分析函式 描述 rank 返回資料項在分割槽中的排名。排名值序列可能會有間隔 dense rank 返回資料項在分割槽中的排名。排名值序列是連續的,沒有間隔 percent rank 計算當前行的百分比排名 x 1 視窗分割槽...
hive計算網頁停留時長
hive表結構例如以下 create table pv user info session id string,user id string,url string,starttime bigint 主要就是這幾個字段實用。省略其它。實現方式 userid和sessionid分組後並按時間降序排序,降...
Hive更換Tez計算引擎
centos7 jdk1.8 hive 2.3.6 hadoop 2.7.7 tez 0.9.2 linux下hive的安裝 用hive直接編寫mr程式,假設有4個有依賴關係的mr作業,上圖中,藍色代表maptask,綠色代表reducetask,雲狀表示中間結果持久化到磁碟 tez可以將多個有依賴...