Начало работы
Настройка Pig
Требования
Обязательные
Пользователям Unix и Windows необходимы следующие:
- Hadoop 2.X - http://hadoop.apache.org/common/releases.html (Вы можете запустить Pig с различными версиями Hadoop, установив HADOOP_HOME, указывающий на каталог, где установлен Hadoop. Если HADOOP_HOME не установлен, по умолчанию Pig будет запущен с встроенной версией, в настоящее время Hadoop 2.7.3.)
- Java 1.7 - http://java.sun.com/javase/downloads/index.jsp (установите JAVA_HOME в корень вашей установки Java)
Необязательные
- Python 2.7 - https://www.python.org (при использовании потоковых Python UDF)
- Ant 1.8 - http://ant.apache.org/ (для сборки)
Загрузка Pig
Чтобы получить дистрибутив Pig, выполните следующие действия:
- Загрузите последнюю стабильную версию с одного из зеркал загрузок Apache (см. Выпуска Pig).
- Разархивируйте загруженный дистрибутив 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.
- Добавьте /pig-n.n.n/bin в ваш путь. Используйте export (bash, sh, ksh) или setenv (tcsh, csh). Например:
$ export PATH=/<my-path-to-pig>/pig-n.n.n/bin:$PATH - Проверьте установку Pig с помощью этой простой команды: $ pig -help
Сборка Pig
Чтобы собрать Pig, выполните следующие действия:
- Выполните откат кода Pig из SVN: svn co http://svn.apache.org/repos/asf/pig/trunk
- Соберите код из каталога верхнего уровня: ant
При успешной сборке, вы должны увидеть файл pig.jar, созданный в этом каталоге. - Проверьте pig.jar, выполнив модульный тест: ant test
Запуск Pig
Вы можете запустить Pig (выполнить выражения Pig Latin и команды Pig) в различных режимах.
| Локальный режим | Локальный режим Tez | Локальный режим Spark | Режим Mapreduce | Режим Tez | Режим Spark | |
| Интерактивный режим | да | экспериментальный | да | да | ||
| Партионный режим | да | экспериментальный | да | да |
Режимы выполнения
Pig имеет шесть режимов выполнения или exectypes:
- Локальный режим - Для запуска Pig в локальном режиме вам нужен доступ к одной машине; все файлы устанавливаются и выполняются на вашем локальном хосте и файловой системе. Укажите локальный режим с помощью флага -x (pig -x local).
- Локальный режим Tez - Для запуска Pig в локальном режиме tez. Он похож на локальный режим, за исключением того, что внутренне Pig вызовет движок выполнения tez. Укажите локальный режим Tez с помощью флага -x (pig -x tez_local).
Примечание: Тез локальный режим экспериментальный. Есть некоторые запросы, которые просто завершаются ошибкой на больших данных в локальном режиме.
- Локальный режим Spark - Для запуска Pig в локальном режиме spark. Он похож на локальный режим, за исключением того, что внутренне Pig вызовет движок выполнения spark. Укажите локальный режим Spark с помощью флага -x (pig -x spark_local).
Примечание: Локальный режим Spark экспериментальный. Есть некоторые запросы, которые просто завершаются ошибкой на больших данных в локальном режиме.
- Режим Mapreduce - Для запуска Pig в режиме mapreduce вам нужен доступ к кластеру Hadoop и установке HDFS. Режим mapreduce является по умолчанию; вы можете, но не обязательно, указать его с помощью флага -x (pig ИЛИ pig -x mapreduce).
- Режим Tez - Для запуска Pig в режиме Tez вам нужен доступ к кластеру Hadoop и установке HDFS. Укажите режим Tez с помощью флага -x (-x tez).
- Режим Spark - Для запуска Pig в режиме Spark вам нужен доступ к кластеру Spark, Yarn или Mesos и установке HDFS. Укажите режим Spark с помощью флага -x (-x spark). В режиме выполнения Spark необходимо установить env::SPARK_MASTER в соответствующее значение (local - локальный режим, yarn-client - режим yarn-client, mesos://host:port - spark на mesos или spark://host:port - кластер spark. Для получения дополнительной информации обратитесь к документации spark по URL-адресам мастера, режим yarn-cluster в настоящее время не поддерживается). Скрипты Pig, выполняемые в режиме Spark, могут использовать функцию динамического распределения. Функцию можно включить, просто включив spark.dynamicAllocation.enabled. Обратитесь к конфигурации spark для получения дополнительной информации о конфигурации. В общем случае все свойства в скрипте pig, начинающиеся с spark., копируются в конфигурацию приложения Spark. Обратите внимание, что вспомогательная служба Yarn должна быть включена в Spark для работы. См. документацию Spark для получения дополнительной информации.
Вы можете запустить 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 ... /* Spark local mode */ $ pig -x spark_local ... /* mapreduce mode */ $ pig ... or $ pig -x mapreduce ... /* Tez mode */ $ pig -x tez ... /* Spark mode */ $ pig -x spark ...
Интерактивный режим
Вы можете запустить 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>
Локальный режим Spark
$ pig -x spark_local ... - Connecting to ... grunt>
Режим Mapreduce
$ pig -x mapreduce ... - Connecting to ... grunt> or $ pig ... - Connecting to ... grunt>
Режим Tez
$ pig -x tez ... - Connecting to ... grunt>
Режим Spark
$ pig -x spark ... - 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
Локальный режим Spark
$ pig -x spark_local id.pig
Режим Mapreduce
$ pig id.pig or $ pig -x mapreduce id.pig
Режим Tez
$ pig -x tez id.pig
Режим Spark
$ pig -x spark 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.
Использование:
- Создайте файл 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
- Установите следующие свойства (либо через файл .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"
- java.security.krb5.conf
ПРИМЕЧАНИЕ: Все пути в этих переменных являются локальными для системы клиента, запускающей фактический скрипт 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, внутреннее соединение и внешнее соединение для группирования или соединения данных в двух или более отношениях.
-
Используйте оператор UNION для объединения содержимого двух или более отношений. Используйте оператор SPLIT для разделения содержимого отношения на несколько отношений.
Хранение промежуточных результатов
Pig хранит промежуточные данные, созданные между операциями MapReduce, во временном месте на HDFS. Это место должно уже существовать на HDFS до использования. Это место может быть настроено с помощью свойства pig.temp.dir. Значение свойства по умолчанию — "/tmp", что соответствует жёстко заданному расположению в Pig 0.7.0 и более ранних версиях.
Хранение окончательных результатов
Используйте оператор STORE и функции загрузки/хранения для записи результатов в файловую систему (PigStorage — функция сохранения по умолчанию).
Примечание: На стадии тестирования/отладки вашей реализации можно использовать DUMP для отображения результатов на экране терминала. Однако в рабочей среде вы всегда хотите использовать оператор STORE для сохранения результатов (см. Store vs. Dump).
Отладка Pig Latin
Pig Latin предоставляет операторы, которые могут помочь вам отладить ваши выражения Pig Latin:
-
Используйте оператор DUMP для отображения результатов на экране терминала.
-
Используйте оператор DESCRIBE для проверки схемы отношения.
-
Используйте оператор EXPLAIN для просмотра логических, физических или планов выполнения MapReduce для вычисления отношения.
-
Используйте оператор ILLUSTRATE для просмотра пошагового выполнения серии операторов.
Сокращения для операторов отладки
Pig предоставляет сокращения для часто используемых операторов отладки (DUMP, DESCRIBE, EXPLAIN, ILLUSTRATE). Эти сокращения можно использовать в оболочке Grunt или в скриптах 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. Вы можете получить список свойств, используя команду помощь по свойствам. Все эти свойства необязательны; ни одно из них не требуется.
Для указания свойств 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 с использованием локального режима Pig, режима mapreduce, режима Tez и режима Spark (см. Режимы выполнения).
Для начала выполните следующие предварительные задачи:
- Убедитесь, что переменная среды JAVA_HOME установлена в корневой каталог вашей установки Java.
- Убедитесь, что в вашей переменной среды PATH включён путь bin/pig (это позволит вам запускать учебники с помощью команды «pig»).
$ export PATH=/<my-path-to-pig>/pig-0.17.0/bin:$PATH
- Установите переменную среды PIG_HOME:
$ export PIG_HOME=/<my-path-to-pig>/pig-0.17.0
- Создайте файл pigtutorial.tar.gz:
- Перейдите в каталог учебника Pig (.../pig-0.17.0/tutorial).
- Запустите команду «ant» из каталога учебника. Это создаст файл pigtutorial.tar.gz.
- Скопируйте файл pigtutorial.tar.gz из каталога учебника Pig в ваш локальный каталог.
- Разархивируйте файл pigtutorial.tar.gz.
$ tar -xzf pigtutorial.tar.gz
- Создаётся новый каталог с именем pigtmp. Этот каталог содержит Файлы учебника по Pig. Эти файлы работают с Hadoop 0.20.2 и включают всё необходимое для запуска Скрипта Pig 1 и Скрипта Pig 2.
Запуск скриптов Pig в локальном режиме
Для запуска скриптов Pig в локальном режиме выполните следующие действия:
- Перейдите в каталог pigtmp.
- Выполните следующую команду (используя либо script1-local.pig, либо script2-local.pig).
$ pig -x local script1-local.pig
Или, если вы используете локальный режим Tez:$ pig -x tez_local script1-local.pig
Или, если вы используете локальный режим Spark:$ pig -x spark_local script1-local.pig
- Просмотрите файлы результатов, расположенные в каталоге 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 или Spark
Для запуска скриптов Pig в режиме mapreduce выполните следующие действия:
- Перейдите в каталог pigtmp.
- Скопируйте файл excite.log.bz2 из каталога pigtmp в каталог HDFS.
$ hadoop fs –copyFromLocal excite.log.bz2 .
- Установите переменную среды 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
Если вы используете Spark, вам также потребуется указать SPARK_HOME и указать SPARK_JAR, который является местоположением в HDFS, куда вы загрузили $SPARK_HOME/lib/spark-assembly*.jar:
export SPARK_HOME=/mysparkhome/; export SPARK_JAR=hdfs://example.com:8020/spark-assembly*.jar
Примечание: PIG_CLASSPATH также может быть использован для добавления любых других зависимостей или файлов ресурсов сторонних библиотек, которые могут потребоваться скрипту Pig. Если также необходимо, чтобы добавленные записи имели наивысший приоритет в порядке расположения в классе Pig JVM, можно также установить переменную среды env-var PIG_USER_CLASSPATH_FIRST в любое значение, например, 'true' (и сбросить env-var, чтобы отключить).
- Установите переменную среды HADOOP_CONF_DIR в расположение каталога конфигурации кластера:
export HADOOP_CONF_DIR=/mycluster/conf
- Выполните следующую команду (используя либо script1-hadoop.pig, либо script2-hadoop.pig):
$ pig script1-hadoop.pig
Или, если вы используете Tez:$ pig -x tez script1-hadoop.pig
Или, если вы используете Spark:$ pig -x spark script1-hadoop.pig
- Просмотрите файлы результатов, расположенные в каталоге 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-файл учебника, чтобы можно было вызывать включённые 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-грамм со следующими полями: час, ngram, рейтинг, подсчёт, среднее значение.
STORE ordered_uniq_frequency INTO '/tmp/tutorial-results' USING PigStorage();
Скрипт Pig 2: Временная популярность запросных фраз
Скрипт Временная популярность запрошенных фраз (script2-local.pig или script2-hadoop.pig) обрабатывает файл журнала поисковых запросов поисковой системы Excite и сравнивает частоту появления запрошенных фраз в двух временных периодах, разделённых двенадцатью часами.
Скрипт представлен ниже:
-
Зарегистрируйте JAR-файл учебника, чтобы можно было вызывать пользовательские функции (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-грамм со следующими полями: ngram, count00, count12.
STORE same1 INTO '/tmp/tutorial-join-results' USING PigStorage();
© 2007–2017 Apache Software Foundation
Licensed under the Apache Software License version 2.0.
https://pig.apache.org/docs/r0.17.0/start.html