Hive計算玩家連勝 連敗

2021-07-03 16:02:09 字數 1840 閱讀 7365

前幾天接到以需求,要求計算玩家的連勝&連敗紀錄,資料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可以將多個有依賴...