Hive计算玩家连胜&连败

原创 2015年07月07日 11:44:14

前几天接到以需求,要求计算玩家的连胜&连败纪录,数据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代表赢

id player_id game_result
1 123 1
2 123 1
3 321 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 "{player_id}\t{win_streak_max}\t{lost_streak_max}".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不久,这样的处理方式虽然能解决问题,但相信这样的处理方式显得很不专业。请各位大牛批评指正。

NBA历史上最长的连胜和连败纪录!

NBA历史上最长连败纪录:克里夫兰骑士,1982年3月19日到11月5日,24场。 一个赛季内最长连败纪录:丹弗掘金,1997年12月9日到1998年1月23日,23场。 最长连胜记录: 在197...
  • zubin006
  • zubin006
  • 2008年03月02日 15:26
  • 1014

NBA历史连胜记录和连胜记录及不可超越的记录

NBA 史上连胜纪录 连胜场次 球队 年份 33 湖人 1971-72 20 雄鹿 1971 19 湖人 2000 18 公牛 1995-96 18 凯尔特人 1982 18 尼克斯...
  • zubin006
  • zubin006
  • 2008年03月01日 18:50
  • 735

网游玩家生命周期

图片转自http://blog.sina.com.cn/s/blog_53902eeb01012tjv.html 玩家接触游戏并开始初步体验核心玩法         对于新玩家,以具观赏性的方...
  • yy1880231
  • yy1880231
  • 2016年09月07日 16:44
  • 379

Hive函数编程-数值计算

四、数值计算 11 1. 取整函数: round 11 2. 指定精度取整函数: round 11 3. 向下取整函数: floor 11 4. 向上取整函数: ceil 12 5. 向...
  • zhoufen12345
  • zhoufen12345
  • 2016年12月13日 12:17
  • 643

hive--基本数据计算

来源:http://blog.csdn.net/lxpbs8851/article/details/39317611 标准差是方差的平方根 1.方差公式: m为x1,x2...xn数列的期望值...
  • qq_34941023
  • qq_34941023
  • 2016年09月27日 13:05
  • 1528

HIVE获取当天时间和计算时差

Hive 获取当前日期,计算时间差
  • cc18868876837
  • cc18868876837
  • 2016年11月11日 20:34
  • 8377

Hive上计算两时点相差分钟数的方法

Hive比较特殊,计算两时间点相差分钟数据的方法是,先将两时间字符串转化成时间格式,然后两者相减,再分别将小时、分钟、秒换算成分钟。 但是,计算两时间点相差的天数又比较简单,直接用datediff函...
  • BabyFish13
  • BabyFish13
  • 2017年05月03日 14:08
  • 2511

hive计算网页停留时长

hive表结构如下:   create table pv_user_info( session_id string, user_id string, url string, starttime bi...
  • itjavaer
  • itjavaer
  • 2015年08月21日 15:22
  • 1855

根据经纬度算出距离

地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为 6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R。...
  • young_kim1
  • young_kim1
  • 2015年01月10日 15:13
  • 1144

一种计算留存的思路

在一些统计系统中,为了观察用户的粘度,我们会计算一系列的叫做留存的指标——次日注册留存、2日注册留存...N日注册留存,比如昨天注册了1000名用户中,在今天有300名用户又登录了,那么对应于昨天的注...
  • cnweike
  • cnweike
  • 2013年04月13日 18:06
  • 2229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hive计算玩家连胜&连败
举报原因:
原因补充:

(最多只允许输入30个字)