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作业?