Скажем, у меня есть временные метки для конкретных пользователей в текстовых файлах, например
#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и write из 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), используя текстовую строку как 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)