Скажем, у меня есть метки времени для конкретных пользователей в текстовых файлах, например
#userid; unix-timestamp; value
1; 2010-01-01 00:00:00; 10
2; 2010-01-01 00:00:00; 20
1; 2010-01-01 01:00:00; 11
2; 2010-01-01 01:00:00, 21
1; 2010-01-02 00:00:00; 12
2; 2010-01-02 00:00:00; 22
У меня есть собственный класс "SessionSummary", реализующий readFields и запись из WritableComparable . Его целью является суммирование всех значений на пользователя за каждый календарный день.
Таким образом, преобразователь отображает строки для каждого пользователя, редуктор суммирует все значения за день для каждого пользователя и выводит SessionSummary как TextOutputFormat (используя toString из SessionSummary , как разделенные табуляцией Строки UTF-8):
1; 2010-01-01; 21
2; 2010-01-01; 41
1; 2010-01-02; 12
2; 2010-01-02; 22
Если мне нужно использовать эти сводные записи для второго этапа Map / Reduce, как я должен анализировать эти сводные данные, чтобы заполнить участников? Можно ли повторно использовать существующие readFields и методы записи (реализации интерфейса WritableComparable ), используя текст String как DataInput каким-либо образом? Это (очевидно) не сработало:
public void map(...) {
SessionSummary ssw = new SessionSummary();
ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8"))));
}
В целом: существует ли лучшая практика для реализации пользовательских ключей и значений в Hadoop и облегчения их многократного использования на нескольких этапах M / R, при этом на каждом этапе сохраняется читаемый человеком текстовый вывод?
(версия Hadoop 0.20.2 / CDH3u3)