MapReduce:加入数据文件并汇总信息

时间:2015-11-20 13:09:21

标签: python hadoop mapreduce hadoop-streaming

我有以下数据集:

提供节目的数据集#1以及该节目的观众数量:

TVShow1,25
TVShow2,30
TVShow3,7
TVShow1,15

数据集#2,提供广播每个节目的频道:

TVShow4,BBC
TVShow2,COM
TVShow1,TNT
TVShow3,TNT

我想计算TNT频道上每个节目的观众总数,例如

TVShow1 40
TVShow3 7

我有以下映射器:

#!/usr/bin/env python
import sys

for line in sys.stdin:
    line       = line.strip()
    key_value  = line.split(",")
    key_in     = key_value[0]
    value_in   = key_value[1]

    if (value_in == 'TNT' or value_in.isdigit()):
        print( '%s\t%s' % (key_in, value_in) )

以下减速机:

#!/usr/bin/env python
import sys

prev_TV_show = "  "
line_cnt           = 0 
tnt_found = False
curr_TV_show_total_cnt = 0

for line in sys.stdin:
    line       = line.strip() 
    key_value  = line.split('\t')
    line_cnt   = line_cnt+1     

    curr_TV_show  = key_value[0]
    value_in   = key_value[1]

    if curr_TV_show != prev_TV_show:
        prev_TV_show = curr_TV_show     

        if (line_cnt>1 and tnt_found == True): 
            print('{0} {1}'.format(curr_TV_show,curr_TV_show_total_cnt))
            tnt_found = False
            curr_TV_show_total_cnt = 0


    if (value_in == 'TNT'): 
        tnt_found = True 
    else:
        curr_TV_show_total_cnt += int(value_in) 

然后我按如下方式测试了代码:

cat data_file*.txt | ./my_mapper.py | sort | ./my_reducer.py

然而,它接缝第一行的观众总数不正确。看起来它是在两个电视节目之间合并的。与管理第一行相关的代码中是否有任何错误?

1 个答案:

答案 0 :(得分:2)

我认为您的代码中存在2个问题 -

  1. 更新prev_TV_show会导致您输入错误的值。您 实际上想用它的'打印prev_TV_show。伯爵,不是 curr_TV_show
  2. 打印上一个迭代值 - 您需要在循环外添加额外的打印(+条件)