Обработка CSV в Hadoop - PullRequest
       7

Обработка CSV в Hadoop

1 голос
/ 25 декабря 2011

У меня есть 6 полей в файле csv:

  • во-первых, это имя студента (String)
  • другие - это оценки студента, такие как предмет 1, предмет 2 и т. Д.

Я пишу mapreduce в Java, разделяя все поля запятыми и отправляя имя студента по ключу и отметки в значении карты.

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

Я думаю, что может быть альтернативный и более эффективный способ сделать это.

Имееткто-нибудь получил представление о лучшем способе выполнения этих операций?

Существуют ли какие-либо встроенные функции hadoop, которые могут группировать по имени учащегося и могут вычислять итоговые оценки и среднее значение, связанное с этим учеником?

Ответы [ 4 ]

2 голосов
/ 25 декабря 2011

Возможно, вы захотите взглянуть на Pig http://pig.apache.org/, которая предоставляет простой язык поверх Hadoop, который позволяет вам выполнять множество стандартных задач с намного более коротким кодом.

1 голос
/ 26 декабря 2011

Используйте HIVE. Это проще, чем писать mapreduce в Java, и, возможно, я более знаком, чем PIG, так как это синтаксис, похожий на SQL.

https://cwiki.apache.org/confluence/display/Hive/Home

Что вам нужно сделать, это 1) установите клиент Hive на своем компьютере или 1 узле и укажите его в своем кластере.2) создать описание таблиц для этого файла 3) загрузить данные 4) написать SQL.Поскольку ваши данные выглядят как имя ученика, имя_представителя_1, субъекта-отметки2 и т. Д., Возможно, вам потребуется использовать explode https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-explode

2) CREATE TABLE студентов (имя STRING, subject1 INT, subject2 INT) СТРОК ФОРМАТА РАЗДЕЛЕННЫЕ ПОЛЯ, ПРЕКРАЩЕННЫЕ',' ХРАНЕНО КАК ПОСЛЕДОВАТЕЛЬНО;

3) ЗАГРУЗИТЬ ВХОД ДАННЫХ '/path/to/data/students.csv' INTO TABLE студентов;

4) ВЫБЕРИТЕ имя, AVG (subject1),AVG (subject2) ИЗ студентов GROUP BY name;

вывод может выглядеть следующим образом:

NAME |SUBJECT1 |ПРЕДМЕТ 2

Джон |6.2 |7,0

том |3,5 |5,0

0 голосов
/ 26 декабря 2011

Я пишу mapreduce в Java, разделяя все поля запятыми и отправляя имя студента по ключу и отметки в значении map.

При уменьшении я обрабатываю их, выводя имя учащегося по ключевым и их оценкам плюс общее, среднее и т. Д. В значении уменьшения.

Это может быть легко написано как задание только для карты, нет необходимости в редукторе. Как только маппер получит строку из CSV, разделите их и рассчитайте только в маппере. И укажите имя студента в качестве ключа и среднее / общее и т. Д. В качестве значения.

0 голосов
/ 26 декабря 2011

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

Как сказал Николас78, вам следует рассмотретьглядя на свинью, которая довольно неплохо справляется с задачей построения эффективной карты / сокращения и экономии вам кода и усилий

...