Как прочитать запись, которая разбита на несколько строк, а также как обрабатывать поврежденные записи во время разделения ввода

У меня есть файл журнала, как показано ниже

Begin ... 12-07-2008 02:00:05         ----> record1
incidentID: inc001
description: blah blah blah 
owner: abc 
status: resolved 
end .... 13-07-2008 02:00:05 
Begin ... 12-07-2008 03:00:05         ----> record2 
incidentID: inc002 
description: blah blah blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah
owner: abc 
status: resolved 
end .... 13-07-2008 03:00:05

Я хочу использовать mapreduce для обработки этого. И я хочу извлечь идентификатор инцидента, статус, а также время, необходимое для инцидента

Как обрабатывать обе записи, так как они имеют переменную длину записи, и что, если входное разбиение происходит до окончания записи.

2 ответа

Решение

Вам нужно будет написать свой собственный формат ввода и программу чтения, чтобы обеспечить правильное разбиение файла вокруг разделителя записей.

По сути, вашему устройству чтения записей нужно будет искать смещение в несколько байтов, сканировать вперед (читать строки), пока не найдет:

  • Begin ... линия
    • Читайте строки до следующего end ... и укажите эти строки между началом и концом в качестве входных данных для следующей записи
  • Он сканирует вставляет конец разделения или находит EOF

По алгоритму это аналогично тому, как XMLInputFormat Mahout обрабатывает многострочный XML как ввод данных - фактически вы можете изменить этот исходный код напрямую, чтобы справиться с вашей ситуацией.

Как уже упоминалось в ответе @ irW, NLineInputFormat это другой вариант, если ваши записи имеют фиксированное количество строк в записи, но на самом деле неэффективны для больших файлов, поскольку для открытия смещений строк во входном формате необходимо открыть и прочитать весь файл. getSplits() метод.

В ваших примерах каждая запись имеет одинаковое количество строк. Если это так, вы можете использовать NLinesInputFormat, если невозможно узнать количество строк, это может быть сложнее. (дополнительная информация о NlinesInputFormat: http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/lib/NLineInputFormat.html).

Другие вопросы по тегам