python

import sys
import datetime
import time

'''
体育 xxxshow               pv      2
体育 xxxshow               uv      auncee
体育 xxxclick              pv      3
体育 xxxclick              uv      ancdejx
体育 yyyrecshow            pv      5
体育 yyyrecshow            uv      aunceed
体育 yyyrecclick           pv      2
体育 yyyrecclick           uv      ancdejs
体育1 xxxshow               pv      2
体育1 xxxshow               uv      auncee
体育1 xxxclick              pv      3
体育1 xxxclick              uv      ancdejx
体育1 yyyrecshow            pv      5
体育1 yyyrecshow            uv      aunceed
体育1 yyyrecclick           pv      2
体育1 yyyrecclick           uv      ancdejs
输出样例
体育     7     5    2    2            showpv   clickpv   showusr   clickusr
'''


def reduce():
    frontType = None   #类别
    showpv = 0
    clickpv = 0
    showusr = 0
    clickusr = 0

    cs = set()       #去除重复的click usrid
    ss = set()       #去除重复的show usrid
    for line in sys.stdin:
        currentType,actionType,puType,reactionType = None,None,None,None
        try:
            currentType,actionType,puType,reactionType = line.split()
        except:
            pass

        # 处理
        if currentType == frontType:    #如果当前类型和前一个类型相同,说明处理的键相同
            if actionType[-1] == 'w':    #如果动作类型是show
                if puType == 'pv':      #如果是pv量
                    showpv += int(reactionType)
                else:
                    if reactionType not in ss:       #如果usrid不在集合中
                        ss.add(reactionType)
                        showusr += 1
            else:                       #如果动作类型是click
                if puType == 'pv':      #如果是pv量
                    clickpv += int(reactionType)
                else:
                    if reactionType not in cs:       #如果usrid不在集合中
                        cs.add(reactionType)
                        clickusr += 1
        else:                           #如果当前类型和之前的类型不同,有两种情况:1.frontType = None or key different
            cs.clear()                  #清空集合
            ss.clear()
            if frontType:               #如果之前的类型不为None说明计算到下一个key
                print('%s\t%s\t%s\t%s\t%s'%(frontType,showpv,clickpv,showusr,clickusr))
            frontType = currentType
            showpv = 0                  #重置计数,重新准备计算当前key
            clickpv = 0
            showusr = 0
            clickusr = 0
            if actionType[-1] == 'w':    #如果动作类型是show
                if puType == 'pv':      #如果是pv量
                    showpv += int(reactionType)
                else:
                    ss.add(reactionType)
                    showusr += 1
            else:
                if puType == 'pv':      #如果是pv量
                    clickpv += int(reactionType)
                else:
                    cs.add(reactionType)
                    clickusr += 1
    print('%s\t%s\t%s\t%s\t%s'%(frontType,showpv,clickpv,showusr,clickusr))

reduce()

方法2:
map阶段可以划分为key = '体育',value = 'xxxshow   pv    2'
然后在reduce阶段在分割value,再继续统计



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值