Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 我的reducer不能完全减少数据_Python_Hadoop_Mapreduce_Combiners - Fatal编程技术网

Python 我的reducer不能完全减少数据

Python 我的reducer不能完全减少数据,python,hadoop,mapreduce,combiners,Python,Hadoop,Mapreduce,Combiners,我正在使用组合器以及映射器和减缩器 我的映射器代码如下: #!/usr/bin/env python import sys import datetime def main(): for line in sys.stdin: data = line.strip().split("\t") if len(data) != 6: continue try: float(data[4])

我正在使用组合器以及映射器和减缩器

我的映射器代码如下:

#!/usr/bin/env python

import sys
import datetime

def main():
    for line in sys.stdin:
        data = line.strip().split("\t")
        if len(data) != 6:
            continue
        try:
            float(data[4])
        except:
            continue
        else: # no exception
            sale_date = data[0]
            ymd = sale_date.split('-')
            date_obj = datetime.date(int(ymd[0]), int(ymd[1]), int(ymd[2]))
            print "{0}\t{1}".format(date_obj.weekday(), data[4])

main()
#!/usr/bin/env python
# this reducer also acts as a combiner
import collections
import sys

def main():

    sales_counter = collections.defaultdict(int)
    sales_sum = collections.defaultdict(float)

    for line in sys.stdin:
        data = line.strip().split("\t")
        if len(data) == 3: # acting as reducer
            sales_counter[data[0]] = sales_counter[data[0]] + int(data[1])
            sales_sum[data[0]] = sales_sum[data[0]] + float(data[2])
        elif len(data) == 2: # acting as combiner
            sales_counter[data[0]] = sales_counter[data[0]] + 1
            sales_sum[data[0]] = sales_sum[data[0]] + float(data[1])
        else:
            continue # invalid line read, ignore

    for key in sorted(sales_sum):
        print key,"\t",sales_counter[key],"\t",sales_sum[key]

main()
我的减速机代码如下:

#!/usr/bin/env python

import sys
import datetime

def main():
    for line in sys.stdin:
        data = line.strip().split("\t")
        if len(data) != 6:
            continue
        try:
            float(data[4])
        except:
            continue
        else: # no exception
            sale_date = data[0]
            ymd = sale_date.split('-')
            date_obj = datetime.date(int(ymd[0]), int(ymd[1]), int(ymd[2]))
            print "{0}\t{1}".format(date_obj.weekday(), data[4])

main()
#!/usr/bin/env python
# this reducer also acts as a combiner
import collections
import sys

def main():

    sales_counter = collections.defaultdict(int)
    sales_sum = collections.defaultdict(float)

    for line in sys.stdin:
        data = line.strip().split("\t")
        if len(data) == 3: # acting as reducer
            sales_counter[data[0]] = sales_counter[data[0]] + int(data[1])
            sales_sum[data[0]] = sales_sum[data[0]] + float(data[2])
        elif len(data) == 2: # acting as combiner
            sales_counter[data[0]] = sales_counter[data[0]] + 1
            sales_sum[data[0]] = sales_sum[data[0]] + float(data[1])
        else:
            continue # invalid line read, ignore

    for key in sorted(sales_sum):
        print key,"\t",sales_counter[key],"\t",sales_sum[key]

main()
数据文件格式如下,仅显示前10行:

2012-01-01  09:00   San Jose    Men's Clothing  214.05  Amex
2012-01-01  09:00   Fort Worth  Women's Clothing    153.57  Visa
2012-01-01  09:00   San Diego   Music   66.08   Cash
2012-01-01  09:00   Pittsburgh  Pet Supplies    493.51  Discover
2012-01-01  09:00   Omaha   Children's Clothing 235.63  MasterCard
2012-01-01  09:00   Stockton    Men's Clothing  247.18  MasterCard
2012-01-01  09:00   Austin  Cameras 379.6   Visa
2012-01-01  09:00   New York    Consumer Electronics    296.8   Cash
2012-01-01  09:00   Corpus Christi  Toys    25.38   Discover
2012-01-01  09:00   Fort Worth  Toys    213.88  Visa
我得到的结果如下:

0   34034   8529272.78
0   567400  141834839.29
1   22715   5660345.68
1   566889  141586312.46
2   22611   5625669.74
2   555219  138745830.2
3   22666   5633975.27
3   567051  141719805.3
4   25365   6363847.75
4   563769  141051081.75
5   34131   8560716.09
5   555310  138849461.48
6   34071   8503163.7
6   567245  141793631.77

我希望每个关键的第一列只看到一个条目。通过组合每个键的部分结果,确实可以得到正确的结果。但我的问题是,为什么每个键都有部分结果?

您是在一台计算机上运行的吗?你测试的是合路器还是减速器?@Picarus没错,它实际上是一台虚拟机。我认为问题在于你生成密钥的过程中。不知怎的,你得到了两个你期望的相同值。数据清理是此类处理中最敏感且通常最耗时的部分。如果没有看到数据,我无法更具体地说。您是否可以生成一个较小的数据集来再现错误?ymd[2]包含什么?为什么您要将数据[4]转换回文本,而不生成另一个利用您已经完成的处理的数据结构?@Picarus ymd包含年、月、日。本质上是在数据输入文件中以“-”连字符分隔列1时生成的列表。数据[4]刚刚被测试转换为浮点,这就是数据[4]的测试。我需要忽略数据[4]无法转换为浮点的行。不确定您关于创建数据结构以重用数据的评论[4]。我打印了所有钥匙的类型。它们都以str的形式出现。我认为这与hadoop映射器和组合器的工作方式有关。我的评论是指从字符串转换为float,再转换回字符串的事实。。。什么是昂贵的,但性能不是这里的关键。我会继续关注您的密钥生成过程…使用int而不是string。如何运行hadoop作业?