0

非常にばかげた質問..次のようなデータがあります

id1, value
1, 20.2
1,20.4
....

id1 の平均値と中央値を知りたいですか? (注..平均、グローバル平均ではなく、各IDの中央値、中央値)私はPython Hadoop Streamingを使用しています..

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   

助言がありますか?

4

1 に答える 1

1

次のように、hadoop-user メーリング リストで同じ問題に回答しました。

この仕事のために何人のリデューサーを始めましたか? このジョブで多数の Reducer を開始すると、part- *という名前の複数の出力ファイルが生成されます。また、各部分は、特定の Reducer パーティションの局所的な平均値と中央値にすぎません。

2 種類の解決策: 1. setNumReduceTasks(1) のメソッドを呼び出して Reducer の数値を 1 に設定すると、出力ファイルが 1 つだけ生成され、個別のキーごとに平均値と中央値が 1 つだけ生成されます。2、Hadoop ソース コードで org.apache.hadoop.examples.WordMedian を参照します。複数の Reducer で生成されたすべての出力ファイルをローカル関数で処理し、最終的な結果を生成します。

于 2013-04-02T09:16:49.343 に答える