Spec-Zone.ru › Apache Pig 0.16

Начало работы

  • Настройка Pig
    • Требования
    • Загрузка Pig
    • Сборка Pig
  • Запуск Pig
    • Режимы выполнения
    • Интерактивный режим
    • Режим пакетной обработки
  • Запуск задач в кластере с Kerberos
    • Задачи с коротким сроком жизни
    • Задачи с длительным сроком жизни
  • Выражения Pig Latin
    • Загрузка данных
    • Работа с данными
    • Сохранение промежуточных результатов
    • Сохранение окончательных результатов
    • Отладка Pig Latin
  • Свойства Pig
  • Учебник по Pig
    • Запуск скриптов Pig в локальном режиме
    • Запуск скриптов Pig в режиме Mapreduce или Tez
    • Файлы учебника по Pig
    • Скрипт Pig 1: Популярность запросов по фразам
    • Скрипт Pig 2: Временная популярность запросов по фразам

Настройка Pig

Требования

Обязательные

Пользователям Unix и Windows требуются следующие компоненты:

  • Hadoop 0.23.X, 1.X или 2.X - http://hadoop.apache.org/common/releases.html (Вы можете запустить Pig с различными версиями Hadoop, установив переменную среды HADOOP_HOME, указывающую на каталог, где установлен Hadoop. Если HADOOP_HOME не задано, по умолчанию Pig будет использовать встроенную версию, в настоящее время Hadoop 1.0.4.)
  • Java 1.7 - http://java.sun.com/javase/downloads/index.jsp (установите JAVA_HOME в корень вашей установки Java)

Необязательные

  • Python 2.7 - https://www.python.org (при использовании Streaming Python UDF)
  • Ant 1.8 - http://ant.apache.org/ (для сборки)

Загрузка Pig

Чтобы получить дистрибутив Pig, выполните следующие действия:

  1. Загрузите последнюю стабильную версию с одного из зеркал загрузки Apache (см. Релизы Pig).
  2. Распакуйте загруженный дистрибутив Pig и обратите внимание на следующее:
    • Файл скрипта Pig, pig, находится в каталоге bin (/pig-n.n.n/bin/pig). Переменные среды Pig описаны в файле скрипта Pig.
    • Файл свойств Pig, pig.properties, находится в каталоге conf (/pig-n.n.n/conf/pig.properties). Вы можете указать альтернативный путь с помощью переменной среды PIG_CONF_DIR.
  3. Добавьте /pig-n.n.n/bin в свой путь. Используйте export (bash, sh, ksh) или setenv (tcsh, csh). Например:
    $ export PATH=/<my-path-to-pig>/pig-n.n.n/bin:$PATH
  4. Проверьте установку Pig с помощью следующей команды: $ pig -help

Сборка Pig

Чтобы собрать Pig, выполните следующие действия:

  1. Скачайте код Pig из SVN: svn co http://svn.apache.org/repos/asf/pig/trunk
  2. Соберите код из корневого каталога: ant
    При успешной сборке должен быть создан файл pig.jar в этом каталоге.
  3. Проверьте pig.jar, запустив юнит-тест: ant test
  4. Если вы используете Hadoop 0.23.X или 2.X, добавьте -Dhadoopversion=23 в командную строку ant в предыдущих шагах.

Запуск Pig

Вы можете запустить Pig (выполнить инструкции Pig Latin и команды Pig) в различных режимах.

Локальный режим Локальный режим Tez Режим Mapreduce Режим Tez
Интерактивный режим да экспериментальный да да
Режим пакетной обработки да экспериментальный да да

Режимы выполнения

Pig имеет два режима выполнения или типа выполнения:

  • Локальный режим - для запуска Pig в локальном режиме, вам нужен доступ к одному компьютеру; все файлы устанавливаются и выполняются на вашем локальном хосте и файловой системе. Укажите локальный режим с помощью флага -x (pig -x local).
  • Локальный режим Tez - для запуска Pig в локальном режиме Tez. Он похож на локальный режим, за исключением того, что внутренне Pig вызовет движок выполнения Tez. Укажите локальный режим Tez с помощью флага -x (pig -x tez_local).

    Примечание: Режим Tez local - экспериментальный. Есть некоторые запросы, которые просто возвращают ошибку при работе с большими данными в локальном режиме.

  • Режим Mapreduce - для запуска Pig в режиме mapreduce, вам нужен доступ к кластеру Hadoop и установке HDFS. Режим mapreduce является по умолчанию; вы можете, но не обязаны, указать его с помощью флага -x (pig или pig -x mapreduce).
  • Режим Tez - для запуска Pig в режиме Tez, вам нужен доступ к кластеру Hadoop и установке HDFS. Укажите режим Tez с помощью флага -x (-x tez).

Вы можете запустить Pig в любом режиме, используя команду "pig" (скрипт Perl bin/pig) или команду "java" (java -cp pig.jar ...).

Примеры

Этот пример демонстрирует, как запустить Pig в локальном и mapreduce режиме с помощью команды pig.

/* local mode */
$ pig -x local ...
 
/* Tez local mode */
$ pig -x tez_local ...
 
/* mapreduce mode */
$ pig ...
or
$ pig -x mapreduce ...

/* Tez mode */
$ pig -x tez ...

Интерактивный режим

Вы можете запустить Pig в интерактивном режиме, используя оболочку Grunt. Вызовите оболочку Grunt, используя команду "pig" (как показано ниже), а затем введите свои инструкции Pig Latin и команды Pig интерактивно в командной строке.

Пример

Эти инструкции Pig Latin извлекают все идентификаторы пользователей из файла /etc/passwd. Сначала скопируйте файл /etc/passwd в ваш локальный рабочий каталог. Далее, вызовите оболочку Grunt, набрав команду "pig" (в локальном или hadoop режиме). Затем введите инструкции Pig Latin интерактивно в приглашении grunt (не забудьте добавить точку с запятой после каждой инструкции). Оператор DUMP отобразит результаты на вашем терминале.

grunt> A = load 'passwd' using PigStorage(':'); 
grunt> B = foreach A generate $0 as id; 
grunt> dump B; 

Локальный режим

$ pig -x local
... - Connecting to ...
grunt> 

Локальный режим Tez

$ pig -x tez_local
... - Connecting to ...
grunt> 

Режим Mapreduce

$ pig -x mapreduce
... - Connecting to ...
grunt> 

or

$ pig 
... - Connecting to ...
grunt> 

Режим Tez

$ pig -x tez
... - Connecting to ...
grunt> 

Режим пакетной обработки

Вы можете запустить Pig в режиме пакетной обработки, используя скрипты Pig и команду "pig" (в локальном или hadoop режиме).

Пример

Инструкции Pig Latin в скрипте Pig (id.pig) извлекают все идентификаторы пользователей из файла /etc/passwd. Сначала скопируйте файл /etc/passwd в ваш локальный рабочий каталог. Затем запустите скрипт Pig из командной строки (используя локальный или mapreduce режим). Оператор STORE запишет результаты в файл (id.out).

/* id.pig */

A = load 'passwd' using PigStorage(':');  -- load the passwd file 
B = foreach A generate $0 as id;  -- extract the user IDs 
store B into 'id.out';  -- write the results to a file name id.out

Локальный режим

$ pig -x local id.pig

Локальный режим Tez

$ pig -x tez_local id.pig

Режим Mapreduce

$ pig id.pig
or
$ pig -x mapreduce id.pig

Режим Tez

$ pig -x tez id.pig

Скрипты Pig

Используйте скрипты Pig для размещения инструкций Pig Latin и команд Pig в одном файле. Хотя это не обязательно, рекомендуется использовать расширение *.pig для идентификации файла.

Вы можете запускать скрипты Pig из командной строки и из оболочки Grunt (см. команды run и exec).

Скрипты Pig позволяют передавать значения параметрам с помощью замены параметров.

Комментарии в скриптах

Вы можете включать комментарии в скрипты Pig:

  • Для многострочных комментариев используйте /* …. */

  • Для однострочных комментариев используйте --

/* myscript.pig
My script is simple.
It includes three Pig Latin statements.
*/

A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, gpa:float); -- loading data
B = FOREACH A GENERATE name;  -- transforming data
DUMP B;  -- retrieving results

Скрипты и распределённые файловые системы

Pig поддерживает запуск скриптов (и JAR-файлов), хранящихся в HDFS, Amazon S3 и других распределённых файловых системах. Требуется полный URI расположения скрипта (см. REGISTER для информации о JAR-файлах). Например, чтобы запустить скрипт Pig в HDFS, выполните следующие действия:

$ pig hdfs://nn.mydomain.com:9020/myscripts/script.pig

Запуск задач в кластере с Kerberos

Kerberos — это система аутентификации, использующая билеты с ограниченным временем действия.
Вследствие этого выполнение скрипта pig на кластере Hadoop, защищенном Kerberos, ограничивает время выполнения максимальной оставшейся продолжительностью действия этих билетов Kerberos. При выполнении очень сложных аналитических операций это может стать проблемой, так как задача может потребовать больше времени, чем позволяют эти билеты.

Кратковременные задачи

При выполнении коротких задач все, что вам нужно сделать, — это убедиться, что пользователь вошел в систему Kerberos с помощью обычного метода kinit.
Hadoop-задача автоматически подберет эти учетные данные, и задача выполнится нормально.

Задачи с длительным временем выполнения

Файл ключей Kerberos — это по существу специфическая для Kerberos форма пароля пользователя.
Можно настроить Hadoop-задачу на запрос новых билетов при их истечении, создав файл keytab и включив его в состав выполняющейся на кластере задачи. Это позволит продлить максимальную продолжительность задачи сверх максимального времени продления билетов Kerberos.

Использование:

  1. Создайте файл keytab для требуемого принципала.
    С помощью инструмента ktutil вы можете создать keytab, используя примерно такие команды:
    addent -password -p niels@EXAMPLE.NL -k 1 -e rc4-hmac
    addent -password -p niels@EXAMPLE.NL -k 1 -e aes256-cts
    wkt niels.keytab
  2. Установите следующие свойства (либо через файл .pigrc, либо в командной строке через -P file)
    • java.security.krb5.conf
      Путь к локальному файлу krb5.conf.
      Обычно это "/etc/krb5.conf"
    • hadoop.security.krb5.principal
      Принципал, с которым вы хотите войти в систему.
      Обычно это выглядит так "niels@EXAMPLE.NL"
    • hadoop.security.krb5.keytab
      Путь к локальному файлу keytab, который должен использоваться для аутентификации.
      Обычно это выглядит так "/home/niels/.krb/niels.keytab"

ПРИМЕЧАНИЕ:Все пути в этих переменных являются локальными для клиентской системы, запускающей фактический скрипт pig. Это можно выполнить без какого-либо специального доступа к узлам кластера.

В целом вы создадите файл, который будет выглядеть так (предположим, мы назовем его niels.kerberos.properties):

java.security.krb5.conf=/etc/krb5.conf
hadoop.security.krb5.principal=niels@EXAMPLE.NL
hadoop.security.krb5.keytab=/home/niels/.krb/niels.keytab

и запустите свой скрипт следующим образом:

pig -P niels.kerberos.properties script.pig

Операторы Pig Latin

Операторы Pig Latin — это базовые конструкции, которые используются для обработки данных с помощью Pig. Оператор Pig Latin — это оператор, который принимает отношение в качестве входных данных и генерирует другое отношение в качестве выходных данных. (Это определение относится ко всем операторам Pig Latin, кроме LOAD и STORE, которые читают данные из и записывают данные в файловую систему.) Операторы Pig Latin могут включать выражения и схемы. Операторы Pig Latin могут занимать несколько строк и должны заканчиваться точкой с запятой (;). По умолчанию операторы Pig Latin обрабатываются с использованием многозадачного выполнения запросов.

Операторы Pig Latin обычно организованы следующим образом:

  • Оператор LOAD для чтения данных из файловой системы.

  • Последовательность операторов «преобразования» для обработки данных.

  • Оператор DUMP для просмотра результатов или оператор STORE для сохранения результатов.

Обратите внимание, что оператор DUMP или STORE необходим для генерации выходных данных.

  • В этом примере Pig проверит, но не выполнит операторы LOAD и FOREACH.

    A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, gpa:float);
    B = FOREACH A GENERATE name;
    
  • В этом примере Pig проверит и выполнит операторы LOAD, FOREACH и DUMP.

    A = LOAD 'student' USING PigStorage() AS (name:chararray, age:int, gpa:float);
    B = FOREACH A GENERATE name;
    DUMP B;
    (John)
    (Mary)
    (Bill)
    (Joe)
    

Загрузка данных

Используйте оператор LOAD и функции загрузки/хранения для чтения данных в Pig (PigStorage — функция загрузки по умолчанию).

Работа с данными

Pig позволяет преобразовывать данные многими способами. В качестве отправной точки ознакомьтесь с этими операторами:

  • Используйте оператор FILTER для работы с кортежами или строками данных. Используйте оператор FOREACH для работы со столбцами данных.

  • Используйте оператор GROUP для группировки данных в одном отношении. Используйте операторы COGROUP, внутреннего JOIN и внешнего JOIN для группировки или объединения данных в двух или более отношениях.

  • Используйте оператор UNION для объединения содержимого двух или более отношений. Используйте оператор SPLIT для разбиения содержимого отношения на несколько отношений.

Хранение промежуточных результатов

Pig хранит промежуточные данные, генерируемые между задачами MapReduce, во временном расположении на HDFS. Это расположение должно уже существовать на HDFS до использования. Это расположение можно настроить, используя свойство pig.temp.dir. Значение свойства по умолчанию — "/tmp", что соответствует жестко заданному расположению в Pig 0.7.0 и более ранних версий.

Хранение конечных результатов

Используйте оператор STORE и функции загрузки/хранения для записи результатов в файловую систему (PigStorage — функция хранения по умолчанию).

Примечание: В процессе тестирования/отладки реализации вы можете использовать DUMP для отображения результатов на экране терминала. Однако в производственной среде всегда следует использовать оператор STORE для сохранения результатов (см. Хранение против вывода).

Отладка Pig Latin

Pig Latin предоставляет операторы, которые могут помочь в отладке операторов Pig Latin:

  • Используйте оператор DUMP для отображения результатов на экране терминала.

  • Используйте оператор DESCRIBE для проверки схемы отношения.

  • Используйте оператор EXPLAIN для просмотра логических, физических или планов выполнения MapReduce для вычисления отношения.

  • Используйте оператор ILLUSTRATE для просмотра пошагового выполнения ряда операторов.

Сокращения для отладки операторов

Pig предоставляет сокращения для часто используемых операторов отладки (DUMP, DESCRIBE, EXPLAIN, ILLUSTRATE). Эти сокращения могут использоваться в оболочке Grunt или в скриптах pig. Ниже приведены поддерживаемые сокращения pig

  • \d alias - сокращение для DUMP оператора. Если alias игнорируется, используется последний определенный alias.

  • \de alias - сокращение для DESCRIBE оператора. Если alias игнорируется, используется последний определенный alias.

  • \e alias - сокращение для EXPLAIN оператора. Если alias игнорируется, используется последний определенный alias.

  • \i alias - сокращение для ILLUSTRATE оператора. Если alias игнорируется, используется последний определенный alias.

  • \q - для выхода из оболочки grunt

Свойства Pig

Pig поддерживает ряд свойств Java, которые можно использовать для настройки поведения Pig. Список свойств можно получить, используя команду help properties. Все эти свойства необязательны; ни одно из них не является обязательным.

Для указания свойств Pig используйте один из этих механизмов:

  • Файл pig.properties (добавьте каталог, содержащий файл pig.properties, в путь к классам)
  • Флаг -D и свойство Pig в переменной окружения PIG_OPTS (export PIG_OPTS=-Dpig.tmpfilecompression=true)
  • Флаг -P в командной строке и файл свойств (pig -P mypig.properties)
  • Команда set (set pig.exec.nocombiner true)

Примечание: Файл свойств использует стандартный формат файла свойств Java.

Поддерживается следующий порядок приоритета: pig.properties < -D Свойство Pig < -P Файл свойств < Команда set. Это означает, что если одно и то же свойство предоставляется с помощью флага –D и флага –P (файл свойств), значение свойства в файле свойств будет иметь приоритет.

Для указания свойств Hadoop можно использовать те же механизмы:

  • Файлы конфигурации Hadoop (включите pig-cluster-hadoop-site.xml)
  • Флаг -D и свойство Hadoop в переменной окружения PIG_OPTS (export PIG_OPTS=–Dmapreduce.task.profile=true)
  • Флаг -P в командной строке и файл свойств (pig -P property_file)
  • Команда set (set mapred.map.tasks.speculative.execution false)

Имеет место тот же порядок приоритета: Файлы конфигурации Hadoop < -D Свойство Hadoop < -P файл_свойств < команда set.

Свойства Hadoop не интерпретируются Pig, а передаются непосредственно Hadoop. Таким образом можно передать любое свойство Hadoop.

Все собранные Pig свойства, включая свойства Hadoop, доступны для любого UDF через объект UDFContext. Для доступа к свойствам можно вызвать метод getJobConf.

Учебник по Pig

Пример использования Pig демонстрирует, как запускать скрипты Pig в локальном режиме, режиме mapreduce и режиме Tez (см. Режимы выполнения).

Для начала выполните следующие предварительные задачи:

  1. Убедитесь, что переменная окружения JAVA_HOME установлена в корневой каталог вашей установки Java.
  2. Убедитесь, что ваш PATH включает bin/pig (это позволит вам запускать примеры с помощью команды «pig»).
    $ export PATH=/<my-path-to-pig>/pig-0.16.0/bin:$PATH 
    
  3. Установите переменную окружения PIG_HOME:
    $ export PIG_HOME=/<my-path-to-pig>/pig-0.16.0 
    
  4. Создайте файл pigtutorial.tar.gz:
    • Перейдите в директорию примеров Pig (.../pig-0.16.0/tutorial).
    • Выполните команду «ant» из директории примеров. Это создаст файл pigtutorial.tar.gz.
  5. Скопируйте файл pigtutorial.tar.gz из директории примеров Pig в вашу локальную директорию.
  6. Разархивируйте файл pigtutorial.tar.gz.
    $ tar -xzf pigtutorial.tar.gz
    
  7. Создается новая директория с именем pigtmp. Эта директория содержит Файлы примеров Pig. Эти файлы работают с Hadoop 0.20.2 и включают все необходимое для запуска Скрипта Pig 1 и Скрипта Pig 2.

Запуск скриптов Pig в локальном режиме

Для запуска скриптов Pig в локальном режиме выполните следующие действия:

  1. Перейдите в директорию pigtmp.
  2. Выполните следующую команду (используя либо script1-local.pig, либо script2-local.pig).
    $ pig -x local script1-local.pig
    
    Или если вы используете локальный режим Tez:
    $ pig -x tez_local script1-local.pig
    
  3. Проверьте файлы результатов, расположенные в директории script1-local-results.txt.

    Вывод может содержать несколько предупреждений Hadoop, которые можно игнорировать:

    2010-04-08 12:55:33,642 [main] INFO  org.apache.hadoop.metrics.jvm.JvmMetrics 
    - Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
    

Запуск скриптов Pig в режиме Mapreduce или Tez

Для запуска скриптов Pig в режиме mapreduce выполните следующие действия:

  1. Перейдите в директорию pigtmp.
  2. Скопируйте файл excite.log.bz2 из директории pigtmp в директорию HDFS.
    $ hadoop fs –copyFromLocal excite.log.bz2 .
    
  3. Установите переменную окружения PIG_CLASSPATH в расположение директории конфигурации кластера (каталог, содержащий файлы core-site.xml, hdfs-site.xml и mapred-site.xml):
    export PIG_CLASSPATH=/mycluster/conf
    

    Если вы используете Tez, вам также потребуется указать директорию конфигурации Tez (директорию, содержащую tez-site.xml):

    export PIG_CLASSPATH=/mycluster/conf:/tez/conf
    

    Примечание: Переменная PIG_CLASSPATH также может быть использована для добавления других зависимостей сторонних разработчиков или файлов ресурсов, которые могут потребоваться скрипту pig. Если также необходимо, чтобы добавленные записи имели наивысший приоритет в порядке расположения в классе JVM Pig, можно установить переменную окружения env-var PIG_USER_CLASSPATH_FIRST в любое значение, например, 'true' (и сбросить переменную окружения, чтобы отключить ее).

  4. Установите переменную окружения HADOOP_CONF_DIR в расположение директории конфигурации кластера:
    export HADOOP_CONF_DIR=/mycluster/conf
    
  5. Выполните следующую команду (используя либо script1-hadoop.pig, либо script2-hadoop.pig):
    $ pig script1-hadoop.pig
    
    Или если вы используете Tez:
    $ pig -x tez script1-hadoop.pig
    
  6. Проверьте файлы результатов, расположенные в директории HDFS script1-hadoop-results или script2-hadoop-results:
    $ hadoop fs -ls script1-hadoop-results
    $ hadoop fs -cat 'script1-hadoop-results/*' | less
    

Файлы примеров Pig

Здесь описано содержимое файла примера Pig (pigtutorial.tar.gz).

Файл

Описание

pig.jar

Файл JAR Pig

tutorial.jar

Пользовательские функции (UDFs) и классы Java

script1-local.pig

Скрипт Pig 1, Популярность поисковых фраз (локальный режим)

script1-hadoop.pig

Скрипт Pig 1, Популярность поисковых фраз (режим mapreduce)

script2-local.pig

Скрипт Pig 2, Временная популярность поисковых фраз (локальный режим)

script2-hadoop.pig

Скрипт Pig 2, Временная популярность поисковых фраз (режим mapreduce)

excite-small.log

Файл журнала, поисковая система Excite (локальный режим)

excite.log.bz2

Файл журнала, поисковая система Excite (режим mapreduce)

Пользовательские функции (UDFs) описаны здесь.

UDF

Описание

ExtractHour

Извлекает час из записи.

NGramGenerator

Создает n-граммы из набора слов.

NonURLDetector

Удаляет запись, если поле запроса пустое или содержит URL.

ScoreGenerator

Вычисляет "популярность" n-граммы.

ToLower

Преобразует поле запроса в нижний регистр.

TutorialUtil

Разделяет строку запроса на набор слов.

Скрипт Pig 1: Популярность поисковых фраз

Скрипт "Популярность поисковых фраз" (script1-local.pig или script1-hadoop.pig) обрабатывает файл журнала поисковых запросов из поисковой системы Excite и находит поисковые фразы, которые часто встречаются в определённые часы дня.

Скрипт представлен здесь:

  • Зарегистрировать файл JAR tutorial, чтобы включенные UDF можно было вызывать в скрипте.

REGISTER ./tutorial.jar; 
  • Использовать функцию PigStorage для загрузки файла журнала excite (excite.log или excite-small.log) в «сырой» пакет как массив записей с полями пользователь, время и запрос.

raw = LOAD 'excite.log' USING PigStorage('\t') AS (user, time, query);
  • Вызвать UDF NonURLDetector для удаления записей, если поле запроса пустое или содержит URL.

clean1 = FILTER raw BY org.apache.pig.tutorial.NonURLDetector(query);
  • Вызвать UDF ToLower для преобразования поля запроса в нижний регистр.

clean2 = FOREACH clean1 GENERATE user, time, org.apache.pig.tutorial.ToLower(query) as query;
  • Поскольку файл журнала содержит только запросы за один день, нас интересует только час. Формат временной метки журнала запросов excite — YYMMDDHHMMSS. Вызовите UDF ExtractHour для извлечения часа (HH) из поля времени.

houred = FOREACH clean2 GENERATE user, org.apache.pig.tutorial.ExtractHour(time) as hour, query;
  • Вызовите UDF NGramGenerator для создания n-грамм запроса.

ngramed1 = FOREACH houred GENERATE user, hour, flatten(org.apache.pig.tutorial.NGramGenerator(query)) as ngram;
  • Используйте оператор DISTINCT для получения уникальных n-грамм для всех записей.

ngramed2 = DISTINCT ngramed1;
  • Используйте оператор GROUP для группировки записей по n-грамме и часу.

hour_frequency1 = GROUP ngramed2 BY (ngram, hour);
  • Используйте функцию COUNT для получения количества (вхождений) каждой n-граммы.

hour_frequency2 = FOREACH hour_frequency1 GENERATE flatten($0), COUNT($1) as count;
  • Используйте оператор GROUP для группировки записей только по n-грамме. Каждая группа теперь соответствует отдельной n-грамме и содержит количество для каждого часа.

uniq_frequency1 = GROUP hour_frequency2 BY group::ngram;
  • Для каждой группы определите час, в котором эта n-грамма используется с высокой частотой. Вызовите UDF ScoreGenerator для вычисления «популярности» n-граммы.

uniq_frequency2 = FOREACH uniq_frequency1 GENERATE flatten($0), flatten(org.apache.pig.tutorial.ScoreGenerator($1));
  • Используйте оператор FOREACH-GENERATE для присвоения имен полям.

uniq_frequency3 = FOREACH uniq_frequency2 GENERATE $1 as hour, $0 as ngram, $2 as score, $3 as count, $4 as mean;
  • Используйте оператор FILTER для удаления всех записей с рейтингом меньше или равным 2.0.

filtered_uniq_frequency = FILTER uniq_frequency3 BY score > 2.0;
  • Используйте оператор ORDER для сортировки оставшихся записей по часам и рейтингу.

ordered_uniq_frequency = ORDER filtered_uniq_frequency BY hour, score;
  • Используйте функцию PigStorage для сохранения результатов. Результирующий файл содержит список n-грамм со следующими полями: час, n-грамма, рейтинг, количество, среднее значение.

STORE ordered_uniq_frequency INTO '/tmp/tutorial-results' USING PigStorage(); 

Скрипт Pig 2: Временная популярность поисковых фраз

Скрипт "Временная популярность поисковых фраз" (script2-local.pig или script2-hadoop.pig) обрабатывает файл журнала поисковых запросов из поисковой системы Excite и сравнивает частоту встречаемости поисковых фраз в двух временных периодах, разделенных на 12 часов.

Скрипт представлен здесь:

  • Зарегистрировать файл JAR tutorial, чтобы включенные пользовательские функции (UDFs) можно было вызывать в скрипте.

REGISTER ./tutorial.jar;
  • Использовать функцию PigStorage для загрузки файла журнала excite (excite.log или excite-small.log) в «сырой» пакет как массив записей с полями пользователь, время и запрос.

raw = LOAD 'excite.log' USING PigStorage('\t') AS (user, time, query);
  • Вызвать UDF NonURLDetector для удаления записей, если поле запроса пустое или содержит URL.

clean1 = FILTER raw BY org.apache.pig.tutorial.NonURLDetector(query);
  • Вызвать UDF ToLower для преобразования поля запроса в нижний регистр.

clean2 = FOREACH clean1 GENERATE user, time, org.apache.pig.tutorial.ToLower(query) as query;
  • Поскольку файл журнала содержит только запросы за один день, нас интересует только час. Формат временной метки журнала запросов excite — YYMMDDHHMMSS. Вызовите UDF ExtractHour для извлечения часа из поля времени.

houred = FOREACH clean2 GENERATE user, org.apache.pig.tutorial.ExtractHour(time) as hour, query;
  • Вызовите UDF NGramGenerator для создания n-грамм запроса.

ngramed1 = FOREACH houred GENERATE user, hour, flatten(org.apache.pig.tutorial.NGramGenerator(query)) as ngram;
  • Используйте оператор DISTINCT для получения уникальных n-грамм для всех записей.

ngramed2 = DISTINCT ngramed1;
  • Используйте оператор GROUP для группировки записей по n-грамме и часу.

hour_frequency1 = GROUP ngramed2 BY (ngram, hour);
  • Используйте функцию COUNT для получения количества (вхождений) каждой n-граммы.

hour_frequency2 = FOREACH hour_frequency1 GENERATE flatten($0), COUNT($1) as count;
  • Используйте оператор FOREACH-GENERATE для присвоения имен полям.

hour_frequency3 = FOREACH hour_frequency2 GENERATE $0 as ngram, $1 as hour, $2 as count;
  • Используйте оператор FILTER для получения n-грамм для часа ‘00’

hour00 = FILTER hour_frequency2 BY hour eq '00';
  • Используйте оператор FILTER для получения n-грамм для часа ‘12’

hour12 = FILTER hour_frequency3 BY hour eq '12';
  • Используйте оператор JOIN для получения n-грамм, которые появляются в обоих часах.

same = JOIN hour00 BY $0, hour12 BY $0;
  • Используйте оператор FOREACH-GENERATE для записи их частоты.

same1 = FOREACH same GENERATE hour_frequency2::hour00::group::ngram as ngram, $2 as count00, $5 as count12;
  • Используйте функцию PigStorage для сохранения результатов. Результирующий файл содержит список n-грамм со следующими полями: n-грамма, количество00, количество12.

STORE same1 INTO '/tmp/tutorial-join-results' USING PigStorage();

© 2007–2016 Apache Software Foundation
Licensed under the Apache Software License version 2.0.
https://pig.apache.org/docs/r0.16.0/start.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API