2012-03-20 3 views
2

Я хотел бы использовать hadoop для обработки неструктурированных CSV-файлов. Эти файлы неструктурированы в том смысле, что они содержат несколько значений данных из разных типов с переменной длиной строки. Кроме того, есть сотни этих файлов, и они часто относительно большие по размеру (> 200 МБ).Обработка неструктурированных данных с помощью Hadoop + MapReduce

Структура каждого файла может быть продемонстрирована следующим образом:

Book  , ISBN   , BookName      , Authors , Edition 
Book  , 978-1934356081, Programming Ruby 1.9   , Dave Thomas, 1 
Book  , 978-0596158101, Programming Python   , Mark Lutz , 4 
... 
BookPrice, ISBN   , Store      , Price 
BookPrice, 978-1934356081, amazon.com     , 30.0 
BookPrice, 978-1934356081, barnesandnoble.com   , 30.67 
BookPrice, 978-0596158101, amazon.com     , 39.55 
BookPrice, 978-0596158101, barnesandnoble.com   , 44.66 
... 
Book  , ISBN   , BookName      , Authors , Edition 
Book  , 978-1449311520, Hadoop - The Definitive Guide, Tom White , 3 
... 

файлы генерируются автоматически, и я не имею никакого контроля над данной структурой. В принципе, есть строка заголовка, за которой следуют строки данных, содержащие значения, соответствующие заголовкам. Тип строки может быть идентифицирован первым разделенным запятой словом. Итак, из примера строка Book содержит метаданные о книгах (имя, isbn, author, edition), а BookPrice содержит различные цены на книги для разных торговых точек/поставщиков.

Я пытаюсь понять, как использовать Map/Reduce для выполнения некоторых обобщенных вычислений по данным. Наличие структурированных данных таким образом, что это затрудняет понимание того, какие пары key -> value извлекать в каждой фазе.

Например, я хотел бы, чтобы вычислить СРЕДНЯЯ, MAX и MIN цены для каждой книги (могут быть объединены/сгруппированы по ISBN). Я понимаю, что могу сделать предварительную обработку, чтобы извлечь эти данные в упорядоченные, однотипные CSV-файлы и работать оттуда (используя grep, python, awk и т. Д.), Но это победит точку использования M/R + Hadoop , и потребует много дополнительной работы.

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

Как я могу реализовать такое задание M/R (в Java) для образца файла/запроса? Благодарю.

ответ

3

Я столкнулся с аналогичным случаем и сделал следующий дизайн:
Я разработал формат ввода, который использует парсер OpenCSV для фактического разделения записей. Затем Я заполнил MapWritable как значение. Каждая карта содержит одну запись с записями «fieldName-> field value».
В вашем случае я хотел бы сделать что-то вроде ключа переписчика, содержащего типа записи, как «цена записи», «авторы записей» и т.д.

Тогда в вас Mapper вы можете написать относительно простой код, который будет распознавать записи, представляющие интереса и совокупностей их.

Немного сложнее, но более полезным способом было бы создать SerDe для улья, который будет отображать файлы в таблицу структуры: тип записи (описанный выше) и столбцы KeyValueMap. (Тип карты поддержки улей для столбца). Тогда вы сможете сделать SQL-запросы против ваших полуструктурированных данных.

+0

очень крутой подход, спасибо. Не могли бы вы поделиться некоторыми из ваших фактических данных/кода реализации? – sa125

+0

Я не против. Бросьте мне электронное письмо, и я буду рад помочь. –

+0

Дэвид, как вы разделили заголовок с файла? Http: //stackoverflow.com/questions/21040166/aggregation-in-mapreduce –