Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с выводом значений / 1 сообщений из 1, страница 1 из 1
05.05.2013, 03:31:59
    #38247999
Стас0н
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с выводом значений
Написал простенькую программу с использованием MapReduce для подсчета количества входящих ребер для вершин. Т.е. сколько вершин имеет количество входящих ребер от 1 до 10 или от 101 до 1000 и т.д..
Входной файл выглядит так:
1 2
1 3
...
первое число - номер вершины, в которую идет направленное ребро из второй вершины (второе число). В строке числа разделены табуляцией. Запускаю один reduce
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
// Mapper
public static class MakePairMapper extends Mapper<Text, Text, Text, IntWritable> {

    private final static IntWritable startValue = new IntWritable(1);

    public void map(Text key, Text value, Context context) throws IOException, InterruptedException {

        context.write(key, startValue);
    }
}

// Reducer
public static class TwittewReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    private static HashMap<Distribution, Integer> mapFromCategoryToUsersNumber;

    private enum Distribution{
        CATEGORY_1("1-10"),
        CATEGORY_2("11-100"),
        CATEGORY_3("101-1000"),
        CATEGORY_4("1001-10000"),
        CATEGORY_5("10001-100000"),
        CATEGORY_6("100001-1000000"),
        CATEGORY_7("1000001-10000000"),
        CATEGORY_8("10000001-100000000");

        private String value;

        Distribution(String value) {
            this.value = value;
        }
        public String toString() {
            return value;
        }
    }

    @Override
    protected void setup(Context context){

        mapFromCategoryToUsersNumber = new HashMap<Distribution, Integer>();

        for ( Distribution distribution : Distribution.values() ){
            mapFromCategoryToUsersNumber.put(distribution, 0);
        }
    }

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {

        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }

        if ( 1 <= sum && sum <= 10 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_1) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_1, currentUsersNumber);
        }
        if ( 11 <= sum && sum <= 100 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_2) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_2, currentUsersNumber);
        }
        if ( 101 <= sum && sum <= 1000 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_3) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_3, currentUsersNumber);
        }
        if ( 1001 <= sum && sum <= 10000 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_4) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_4, currentUsersNumber);
        }
        if ( 10001 <= sum && sum <= 100000 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_5) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_5, currentUsersNumber);
        }
        if ( 100001 <= sum && sum <= 1000000 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_6) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_6, currentUsersNumber);
        }
        if ( 1000001 <= sum && sum <= 10000000 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_7) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_7, currentUsersNumber);
        }
        if ( 10000001 <= sum && sum <= 100000000 ){
            int currentUsersNumber = mapFromCategoryToUsersNumber.get(Distribution.CATEGORY_8) + 1;
            mapFromCategoryToUsersNumber.put(Distribution.CATEGORY_8, currentUsersNumber);
        }
    }

    @Override
    protected void cleanup(Context context) throws IOException, InterruptedException {

        for ( Distribution distribution : Distribution.values() ){

            context.write(new Text(distribution.toString()), 
                    new IntWritable(mapFromCategoryToUsersNumber.get(distribution)));
        }
        mapFromCategoryToUsersNumber.clear();
    }
}


Тестировал вот на таких данных:
1 2
1 3
1 4
2 4
3 4
На выходе:
1-10 1 (а должно быть 3)
11-100 0
101-1000 0
1001-10000 0
10001-100000 0
100001-1000000 0
1000001-10000000 0
10000001-100000000 0
В чем проблема?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с выводом значений / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]