Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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 hadoop流媒体查找平均中值_Hadoop_Hadoop Streaming - Fatal编程技术网

使用python hadoop流媒体查找平均中值

使用python hadoop流媒体查找平均中值,hadoop,hadoop-streaming,Hadoop,Hadoop Streaming,非常愚蠢的问题。。 我有如下数据 id1, value 1, 20.2 1,20.4 .... 我想找出id1的平均值和中位数? (注..每个id的平均值、中位数,而不是全局平均值、中位数) 我正在使用python hadoop流媒体 mapper.py for line in sys.stdin: try: # remove leading and trailing whitespace line = line.rstrip(os.linesep)

非常愚蠢的问题。。 我有如下数据

id1, value
1, 20.2
1,20.4
....
我想找出id1的平均值和中位数? (注..每个id的平均值、中位数,而不是全局平均值、中位数) 我正在使用python hadoop流媒体

mapper.py
for line in sys.stdin:
    try:
    # remove leading and trailing whitespace
        line = line.rstrip(os.linesep)
        tokens = line.split(",")

            print '%s,%s' % (tokens[0],tokens[1])
    except Exception:
        continue


reducer.py
data_dict = defaultdict(list)
def mean(data_list):
    return sum(data_list)/float(len(data_list)) if len(data_list) else 0
def median(mylist):
    sorts = sorted(mylist)
    length = len(sorts)
    if not length % 2:
        return (sorts[length / 2] + sorts[length / 2 - 1]) / 2.0
    return sorts[length / 2]


for line in sys.stdin:
    try:
        line = line.rstrip(os.linesep)
        serial_id, duration = line.split(",")
        data_dict[serial_id].append(float(duration))
    except Exception:
        pass
for k,v in data_dict.items():
    print "%s,%s,%s" %(k, mean(v), median(v))
我希望每个关键点都有一个平均值和中位数 但我发现id1的平均值和中位数不同。。 例如关于做grep

mean_median/part-00003:SH002616940000,5.0,5.0   
mean_median/part-00008:SH002616940000,901.0,901.0   
mean_median/part-00018:SH002616940000,11.0,11.0 
mean_median/part-00000:SH002616940000,2.0,2.0   
mean_median/part-00025:SH002616940000,1800.0,1800.0 
mean_median/part-00002:SH002616940000,4.0,4.0   
mean_median/part-00006:SH002616940000,8.0,8.0   
mean_median/part-00021:SH002616940000,14.0,14.0 
mean_median/part-00001:SH002616940000,3.0,3.0   
mean_median/part-00022:SH002616940000,524.666666667,26.0    
mean_median/part-00017:SH002616940000,65.0,65.0 
mean_median/part-00016:SH002616940000,1384.0,1384.0 
mean_median/part-00020:SH002616940000,596.0,68.0    
mean_median/part-00014:SH002616940000,51.0,51.0 
mean_median/part-00004:SH002616940000,6.0,6.0   
mean_median/part-00005:SH002616940000,7.0,7.0   

有什么建议吗?

我在hadoop用户邮件列表中回答了同样的问题,如下所示:

你开始做这项工作有多少人? 如果为此作业启动多个减速机,它将生成多个名为part-*的输出文件。 每个部分仅为特定减速器分区的局部平均值和中值

两种解决方案: 1,调用setNumReduceTasks(1)的方法将减速机编号设置为1,它将只生成一个输出文件,每个不同的键将只生成一个平均值和中值。
2、参考hadoop源代码中的org.apache.hadoop.examples.WordMedian。它通过一个本地函数处理多个Reducer生成的所有输出文件,并生成最终结果。

默认情况下,流式处理使用tab作为分隔符。你把它设置成逗号了吗?是的。。我认为是这样。。我的意思是我使用的代币=line.split(“,”)??所以它解析得很好?相信我,这根本不是一个愚蠢的问题在Hadoop中,任何需要了解全局状态(如平均值/中值)的问题都不是那么简单。