Как мы можем использовать Apache Pig для неформатированных данных? - PullRequest
2 голосов
/ 26 декабря 2011

Я хочу использовать Apache pig, но до сих пор я только что проанализировал отформатированные данные, такие как CSV или разделенные запятыми и т. Д.

Но если у меня есть некоторые данные, разделенные ';' & '@ & @' и т. д., как с ним работать?

Например, когда я использовал MapReduce Я разделяю данные на ";" на карте, а затем снова "@ & @" в уменьшении.

Также предположим, например, что у нас есть CSV-файл с первым именем пользователя поля, созданный в формате «FirstnameLastname»,

raw = LOAD 'log.csv' USING PigStorage(',') AS (username: chararray, site: chararray, viwes: int);

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

Ответы [ 2 ]

4 голосов
/ 27 декабря 2011

Вы можете делать практически все, что может делать Java или Python с UDF в Pig. Свинья не предназначена для того, чтобы иметь исчерпывающий набор функций обработки, она просто обеспечивает базовую функциональность. Piggybank заполняет нишу пользовательского кода для работы, собирая кучу пользовательских UDF. Иногда в копилке просто нет того, что вам нужно. Хорошо, что UDF довольно просто написать.

  • Вы можете написать пользовательский загрузчик , который обрабатывает уникальную структуру ваших данных во время загрузки. Пользовательская функция загрузки обрабатывает данные с помощью кода Java и выводит их структурированный столбчатый формат, который ищет Pig. Еще одна приятная вещь о клиентских загрузчиках заключается в том, что вы можете указать схему загрузки, чтобы вам не приходилось выписывать AS (...)

    A = LOAD 'log.csv' USING MyCustomLoader('whatever', 'parameters);
    
  • Вы можете написать пользовательскую функцию оценки . Иногда такая функция, как SPLIT или TOKENIZE просто не достаточно хороша. Используйте TextLoader , чтобы построчно получать данные, а затем используйте UDF для анализа этой строки и вывода кортежа (который затем может быть сведен в столбцы).

    A = LOAD 'log.csv' USING TextLoader() as (line:char array);
    B = FOREACH A GENERATE FLATTEN(CustomLineParser(line));
    
2 голосов
/ 26 декабря 2011

Может быть, вы можете использовать STRSPLIT , чтобы разделить строку во второй раз:

Также ; можно разделить на \\u003B

...