Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MapReduce:连接数据文件并汇总信息_Python_Hadoop_Mapreduce_Hadoop Streaming - Fatal编程技术网

Python MapReduce:连接数据文件并汇总信息

Python MapReduce:连接数据文件并汇总信息,python,hadoop,mapreduce,hadoop-streaming,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:

我有以下数据集:

提供节目和该节目观众数量的数据集#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

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

我认为您的代码中有两个问题-

  • 更新prev_TV_show会导致打印错误的值。你 实际上,想要打印上一个电视节目的“计数”,而不是 电视节目
  • 打印上一次迭代值-您需要在循环外添加额外的打印(+条件)

  • @本·沃森:对不起,这个错误只是因为缺乏记忆。现在它起作用了。然而,无论如何,结果是不正确的。所以,我相应地更新了我的问题。你能在你的问题中提供一些不正确的输出样本吗?“这样我才能确定你看到了什么”。@本·沃森:我看到的第一行是TVshow347。其余的行似乎是正确的。谢谢!现在它起作用了。只有一个疑问。您知道为什么测试的输出(cat data_file*.txt |./my_mapper.py | sort |./my_reducer.py)与运行Hadoop streaming命令返回的结果略有不同吗?特别是,TVShow5在测试后等于10,而在运行流媒体命令后等于0。这有点奇怪。