Как прочитать запись, которая разбита на несколько строк, а также как обрабатывать поврежденные записи во время разделения ввода
У меня есть файл журнала, как показано ниже
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).