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不久,这样的处理方式虽然能解决问题,但相信这样的处理方式显得很不专业。请各位大牛批评指正。

相关文章推荐

AV-Test发布最新企业级端点安全评测:云计算安全技术架构助趋势科技OfficeScan获七连胜

[趋势科技中国– [2011年7月11日]近日,全球著名的反病毒测试机构AV-Test.org最新发布的2011企业级端点安全防护软件产品测试报告显示,趋势科技OfficeScan产品凭借领先业界的云...
  • iqushi
  • iqushi
  • 2011年07月25日 16:04
  • 1230

围棋AI连胜人类50场,是时候认真思考如何应对人工智能了

导语 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得50胜0败的恐怖战绩,展现出的围棋技艺...

AlphaGo棋手Master战胜聂卫平与柯洁60连胜

AlphaGo棋手Master战胜聂卫平与柯洁60连胜  幕后工程师为黄士杰 BY 氧分子网 · 2017 年 01 月 06 日 北京时间1月5日消息,谷歌 DeepMind 开...
  • zzwu
  • zzwu
  • 2017年01月06日 21:35
  • 1174

Pinterest炒作连胜?

Pinterest今年已经成为热点话题。也许我们可以称之为炒作连胜? 根据网络趋势调查公司comScore今年二月的数据表示,Pinterest每个月都有超过10亿的独立用户增长,这超过了以往任何网...

玩家网外推程序

  • 2016年06月26日 12:38
  • 397KB
  • 下载

游戏服务端线程模型——无锁处理玩家请求

采用线程池组技巧,实现游戏服务端为每一个角色指派固定线程,从而达到无锁处理玩家个人请求。...

【转】关于构造玩家间冲突

  • 2010年06月01日 11:06
  • 41KB
  • 下载

IT管理软件市场有哪些玩家

IT管理软件是市场上主要的玩家有“4大”厂商和“小4大”厂商; “4大”是HP OpenView、IBM Tivoli、 CA Unicenter、BMC Patrol; “小4大”厂商是Zeno...
  • findgem
  • findgem
  • 2014年08月22日 11:11
  • 394
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hive计算玩家连胜&连败
举报原因:
原因补充:

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