Apache Pig - Краткое руководство

Что такое Apache Pig?

Apache Pig - это абстракция над MapReduce. Это инструмент / платформа, которая используется для анализа больших наборов данных, представляющих их в виде потоков данных. Свинью обычно используют сHadoop; мы можем выполнять все операции с данными в Hadoop с помощью Apache Pig.

Для написания программ анализа данных Pig предоставляет язык высокого уровня, известный как Pig Latin. Этот язык предоставляет различные операторы, с помощью которых программисты могут разрабатывать свои собственные функции для чтения, записи и обработки данных.

Для анализа данных с помощью Apache Pig, программистам необходимо писать скрипты на языке Pig Latin. Все эти скрипты внутренне конвертируются в задачи Map и Reduce. Apache Pig имеет компонент, известный какPig Engine который принимает сценарии Pig Latin в качестве входных данных и преобразует эти сценарии в задания MapReduce.

Зачем нам Apache Pig?

Программисты, не очень хорошо разбирающиеся в Java, обычно испытывали трудности при работе с Hadoop, особенно при выполнении любых задач MapReduce. Apache Pig - находка для всех таких программистов.

  • С помощью Pig Latin, программисты могут легко выполнять задачи MapReduce, не набирая сложные коды на Java.

  • Apache Pig использует multi-query approach, тем самым уменьшая длину кодов. Например, операция, которая потребует от вас ввести 200 строк кода (LoC) на Java, может быть легко выполнена, набрав всего 10 строк кода в Apache Pig. В конечном итоге Apache Pig сокращает время разработки почти в 16 раз.

  • Свинья на латыни SQL-like language и выучить Apache Pig легко, если вы знакомы с SQL.

  • Apache Pig предоставляет множество встроенных операторов для поддержки операций с данными, таких как объединения, фильтры, упорядочение и т. Д. Кроме того, он также предоставляет вложенные типы данных, такие как кортежи, пакеты и карты, которые отсутствуют в MapReduce.

Особенности Свиньи

Apache Pig имеет следующие функции -

  • Rich set of operators - Он предоставляет множество операторов для выполнения таких операций, как соединение, сортировка, фильтрация и т. Д.

  • Ease of programming - Pig Latin похож на SQL и легко написать сценарий Pig, если вы хорошо разбираетесь в SQL.

  • Optimization opportunities - Задачи в Apache Pig автоматически оптимизируют свое выполнение, поэтому программистам нужно сосредоточиться только на семантике языка.

  • Extensibility - Используя существующие операторы, пользователи могут разрабатывать свои собственные функции для чтения, обработки и записи данных.

  • UDF’s - Свинья дает возможность создавать User-defined Functions на других языках программирования, таких как Java, и вызывать или встраивать их в Pig Scripts.

  • Handles all kinds of data- Apache Pig анализирует все виды данных, как структурированные, так и неструктурированные. Он сохраняет результаты в HDFS.

Apache Pig против MapReduce

Ниже перечислены основные различия между Apache Pig и MapReduce.

Апачская свинья Уменьшение карты
Apache Pig - это язык потока данных. MapReduce - это парадигма обработки данных.
Это язык высокого уровня. MapReduce низкоуровневый и жесткий.
Выполнить операцию соединения в Apache Pig довольно просто. В MapReduce довольно сложно выполнить операцию соединения между наборами данных.
Любой начинающий программист с базовыми знаниями SQL может удобно работать с Apache Pig. Для работы с MapReduce необходимо знакомство с Java.
Apache Pig использует подход с несколькими запросами, что в значительной степени сокращает длину кодов. MapReduce потребует почти в 20 раз больше строк для выполнения той же задачи.
Нет необходимости в компиляции. При выполнении каждый оператор Apache Pig внутренне преобразуется в задание MapReduce. Задания MapReduce требуют длительного процесса компиляции.

Apache Pig против SQL

Ниже перечислены основные различия между Apache Pig и SQL.

Свинья SQL
Свинья на латыни procedural язык. SQL - это declarative язык.
В Apache Pig, schemaне является обязательным. Мы можем хранить данные без разработки схемы (значения хранятся как$01, $02 и т. Д.) Схема обязательна в SQL.
Модель данных в Apache Pig: nested relational. Модель данных, используемая в SQL is flat relational.
Apache Pig предоставляет ограниченные возможности для Query optimization. В SQL больше возможностей для оптимизации запросов.

В дополнение к указанным выше различиям, Apache Pig Latin -

  • Позволяет разделить трубопровод.
  • Позволяет разработчикам хранить данные в любом месте конвейера.
  • Объявляет планы выполнения.
  • Предоставляет операторы для выполнения функций ETL (извлечение, преобразование и загрузка).

Apache Pig против Hive

И Apache Pig, и Hive используются для создания заданий MapReduce. А в некоторых случаях Hive работает с HDFS аналогично Apache Pig. В следующей таблице мы перечислили несколько важных моментов, которые отличают Apache Pig от Hive.

Апачская свинья Улей
Apache Pig использует язык под названием Pig Latin. Первоначально он был создан вYahoo. Улей использует язык под названием HiveQL. Первоначально он был создан вFacebook.
Pig Latin - это язык потока данных. HiveQL - это язык обработки запросов.
Свинья-латынь - это процедурный язык, который вписывается в парадигму конвейера. HiveQL - декларативный язык.
Apache Pig может обрабатывать структурированные, неструктурированные и частично структурированные данные. Hive в основном предназначен для структурированных данных.

Приложения Apache Pig

Apache Pig обычно используется специалистами по обработке данных для выполнения задач, включающих специальную обработку и быстрое создание прототипов. Используется Apache Pig -

  • Для обработки огромных источников данных, таких как веб-журналы.
  • Выполнять обработку данных для поисковых платформ.
  • Для обработки загрузки данных, чувствительных ко времени.

Apache Pig - История

В 2006, Apache Pig был разработан в Yahoo в качестве исследовательского проекта, в частности, для создания и выполнения заданий MapReduce для каждого набора данных. В2007, Исходный код Apache Pig был открыт через инкубатор Apache. В2008, вышел первый выпуск Apache Pig. В2010, Apache Pig завершился как проект верхнего уровня Apache.

Язык, используемый для анализа данных в Hadoop с помощью Pig, известен как Pig Latin. Это язык обработки данных высокого уровня, который предоставляет богатый набор типов данных и операторов для выполнения различных операций с данными.

Для выполнения конкретной задачи Программисты, использующие Pig, программисты должны написать сценарий Pig, используя язык Pig Latin, и выполнить их, используя любой из механизмов выполнения (Grunt Shell, UDFs, Embedded). После выполнения эти сценарии пройдут серию преобразований, применяемых Pig Framework, для получения желаемого результата.

Внутри Apache Pig преобразует эти сценарии в серию заданий MapReduce и, таким образом, упрощает работу программиста. Архитектура Apache Pig показана ниже.

Компоненты Apache Pig

Как показано на рисунке, в структуре Apache Pig есть различные компоненты. Давайте посмотрим на основные компоненты.

Парсер

Первоначально скрипты Pig обрабатываются парсером. Он проверяет синтаксис сценария, выполняет проверку типов и другие разные проверки. Результатом синтаксического анализа будет DAG (направленный ациклический граф), который представляет операторы Pig Latin и логические операторы.

В группе DAG логические операторы сценария представлены как узлы, а потоки данных представлены как края.

Оптимизатор

Логический план (DAG) передается логическому оптимизатору, который выполняет логические оптимизации, такие как проекция и выталкивание.

Компилятор

Компилятор компилирует оптимизированный логический план в серию заданий MapReduce.

Механизм исполнения

Наконец, задания MapReduce отправляются в Hadoop в отсортированном порядке. Наконец, эти задания MapReduce выполняются в Hadoop, что дает желаемые результаты.

Модель данных Pig Latin

Модель данных Pig Latin полностью вложена и допускает сложные неатомарные типы данных, такие как map и tuple. Ниже приводится схематическое представление модели данных Pig Latin.

Атом

Любое отдельное значение в Pig Latin, независимо от типа данных, называется Atom. Он хранится в виде строки и может использоваться как строка и число. int, long, float, double, chararray и bytearray - это атомарные значения Pig. Часть данных или простое атомарное значение известно какfield.

Example - «раджа» или «30»

Кортеж

Запись, состоящая из упорядоченного набора полей, называется кортежем, поля могут быть любого типа. Кортеж похож на строку в таблице СУБД.

Example - (Раджа, 30)

Сумка

Мешок - это неупорядоченный набор кортежей. Другими словами, набор кортежей (неуникальных) называется мешком. Каждый кортеж может иметь любое количество полей (гибкая схема). Сумка обозначается символом '{}'. Она похожа на таблицу в РСУБД, но в отличие от таблицы в РСУБД не обязательно, чтобы каждый кортеж содержал одинаковое количество полей или чтобы поля в одной позиции (столбце) имели один и тот же тип.

Example - {(Раджа, 30), (Мохаммад, 45)}

Сумка может быть полем в отношении; в этом контексте он известен какinner bag.

Example- {Раджа, 30, {9848022338, [email protected],} }

карта

Карта (или карта данных) - это набор пар ключ-значение. Вkeyдолжен иметь тип chararray и быть уникальным. Вvalueможет быть любого типа. Он представлен как '[]'

Example - [имя # Раджа, возраст # 30]

Связь

Отношение - это набор кортежей. Отношения в Pig Latin неупорядочены (нет гарантии, что кортежи обрабатываются в каком-либо определенном порядке).

В этой главе объясняется, как загрузить, установить и настроить Apache Pig в вашей системе.

Предпосылки

Перед переходом на Apache Pig важно, чтобы в вашей системе были установлены Hadoop и Java. Поэтому перед установкой Apache Pig установите Hadoop и Java, выполнив действия, указанные в следующей ссылке -

http://www.tutorialspoint.com/hadoop/hadoop_enviornment_setup.htm

Скачать Apache Pig

Прежде всего, загрузите последнюю версию Apache Pig со следующего веб-сайта - https://pig.apache.org/

Шаг 1

Откройте домашнюю страницу веб-сайта Apache Pig. Под разделомNews, нажмите на ссылку release page как показано на следующем снимке.

Шаг 2

При нажатии на указанную ссылку вы будете перенаправлены на Apache Pig Releasesстраница. На этой странице подDownload раздела у вас будет две ссылки, а именно Pig 0.8 and later и Pig 0.7 and before. Щелкните ссылкуPig 0.8 and later, то вы будете перенаправлены на страницу с набором зеркал.

Шаг 3

Выберите и щелкните любое из этих зеркал, как показано ниже.

Шаг 4

Эти зеркала перенесут вас в Pig Releasesстраница. Эта страница содержит различные версии Apache Pig. Выберите среди них последнюю версию.

Шаг 5

В этих папках у вас будут исходные и двоичные файлы Apache Pig в различных дистрибутивах. Загрузите tar-файлы исходных и двоичных файлов Apache Pig 0.15,pig0.15.0-src.tar.gz и pig-0.15.0.tar.gz.

Установите Apache Pig

После загрузки программного обеспечения Apache Pig установите его в среде Linux, следуя инструкциям ниже.

Шаг 1

Создайте каталог с именем Pig в том же каталоге, где находятся каталоги установки Hadoop, Java,и другое программное обеспечение было установлено. (В нашем руководстве мы создали каталог Pig в пользователе с именем Hadoop).

$ mkdir Pig

Шаг 2

Извлеките загруженные файлы tar, как показано ниже.

$ cd Downloads/ 
$ tar zxvf pig-0.15.0-src.tar.gz $ tar zxvf pig-0.15.0.tar.gz

Шаг 3

Переместите содержимое pig-0.15.0-src.tar.gz файл в Pig каталог, созданный ранее, как показано ниже.

$ mv pig-0.15.0-src.tar.gz/* /home/Hadoop/Pig/

Настроить Apache Pig

После установки Apache Pig нам нужно его настроить. Для настройки нам нужно отредактировать два файла -bashrc and pig.properties.

.bashrc файл

в .bashrc файл, установите следующие переменные -

  • PIG_HOME папку в папку установки Apache Pig,

  • PATH переменную среды в папку bin и

  • PIG_CLASSPATH переменную среды в папку etc (конфигурация) ваших установок Hadoop (каталог, содержащий файлы core-site.xml, hdfs-site.xml и mapred-site.xml).

export PIG_HOME = /home/Hadoop/Pig
export PATH  = $PATH:/home/Hadoop/pig/bin
export PIG_CLASSPATH = $HADOOP_HOME/conf

файл pig.properties

в conf папка Pig, у нас есть файл с именем pig.properties. В файле pig.properties вы можете установить различные параметры, как указано ниже.

pig -h properties

Поддерживаются следующие свойства -

Logging: verbose = true|false; default is false. This property is the same as -v
       switch brief=true|false; default is false. This property is the same 
       as -b switch debug=OFF|ERROR|WARN|INFO|DEBUG; default is INFO.             
       This property is the same as -d switch aggregate.warning = true|false; default is true. 
       If true, prints count of warnings of each type rather than logging each warning.		 
		 
Performance tuning: pig.cachedbag.memusage=<mem fraction>; default is 0.2 (20% of all memory).
       Note that this memory is shared across all large bags used by the application.         
       pig.skewedjoin.reduce.memusagea=<mem fraction>; default is 0.3 (30% of all memory).
       Specifies the fraction of heap available for the reducer to perform the join.
       pig.exec.nocombiner = true|false; default is false.
           Only disable combiner as a temporary workaround for problems.         
       opt.multiquery = true|false; multiquery is on by default.
           Only disable multiquery as a temporary workaround for problems.
       opt.fetch=true|false; fetch is on by default.
           Scripts containing Filter, Foreach, Limit, Stream, and Union can be dumped without MR jobs.         
       pig.tmpfilecompression = true|false; compression is off by default.             
           Determines whether output of intermediate jobs is compressed.         
       pig.tmpfilecompression.codec = lzo|gzip; default is gzip.
           Used in conjunction with pig.tmpfilecompression. Defines compression type.         
       pig.noSplitCombination = true|false. Split combination is on by default.
           Determines if multiple small files are combined into a single map.         
			  
       pig.exec.mapPartAgg = true|false. Default is false.             
           Determines if partial aggregation is done within map phase, before records are sent to combiner.         
       pig.exec.mapPartAgg.minReduction=<min aggregation factor>. Default is 10.             
           If the in-map partial aggregation does not reduce the output num records by this factor, it gets disabled.
			  
Miscellaneous: exectype = mapreduce|tez|local; default is mapreduce. This property is the same as -x switch
       pig.additional.jars.uris=<comma seperated list of jars>. Used in place of register command.
       udf.import.list=<comma seperated list of imports>. Used to avoid package names in UDF.
       stop.on.failure = true|false; default is false. Set to true to terminate on the first error.         
       pig.datetime.default.tz=<UTC time offset>. e.g. +08:00. Default is the default timezone of the host.
           Determines the timezone used to handle datetime datatype and UDFs.
Additionally, any Hadoop property can be specified.

Проверка установки

Проверьте установку Apache Pig, введя команду версии. Если установка прошла успешно, вы получите версию Apache Pig, как показано ниже.

$ pig –version 
 
Apache Pig version 0.15.0 (r1682971)  
compiled Jun 01 2015, 11:44:35

В предыдущей главе мы объяснили, как установить Apache Pig. В этой главе мы обсудим, как запустить Apache Pig.

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

Вы можете запустить Apache Pig в двух режимах, а именно: Local Mode и HDFS mode.

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

В этом режиме все файлы устанавливаются и запускаются с вашего локального хоста и локальной файловой системы. Нет необходимости в Hadoop или HDFS. Этот режим обычно используется для тестирования.

Режим MapReduce

В режиме MapReduce мы загружаем или обрабатываем данные, существующие в файловой системе Hadoop (HDFS), с помощью Apache Pig. В этом режиме всякий раз, когда мы выполняем операторы Pig Latin для обработки данных, на серверной стороне вызывается задание MapReduce для выполнения определенной операции с данными, которые существуют в HDFS.

Механизмы выполнения Apache Pig

Сценарии Apache Pig могут выполняться тремя способами, а именно в интерактивном режиме, пакетном режиме и встроенном режиме.

  • Interactive Mode(Оболочка Grunt) - Вы можете запустить Apache Pig в интерактивном режиме с помощью оболочки Grunt. В этой оболочке вы можете ввести операторы Pig Latin и получить результат (с помощью оператора Dump).

  • Batch Mode (Сценарий) - Вы можете запустить Apache Pig в пакетном режиме, написав сценарий Pig Latin в одном файле с .pig расширение.

  • Embedded Mode (UDF) - Apache Pig предоставляет возможность определения наших собственных функций (Uсер Dопределен Functions) в языках программирования, таких как Java, и используя их в нашем скрипте.

Вызов Grunt Shell

Вы можете вызвать оболочку Grunt в желаемом режиме (локальный / MapReduce), используя −x вариант, как показано ниже.

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

Command −

$ ./pig –x местный

Command −

$ ./pig -x mapreduce

Output -

Output -

Любая из этих команд выдает приглашение оболочки Grunt, как показано ниже.

grunt>

Вы можете выйти из оболочки Grunt, используя ‘ctrl + d’.

После вызова оболочки Grunt вы можете выполнить сценарий Pig, напрямую введя в него операторы Pig Latin.

grunt> customers = LOAD 'customers.txt' USING PigStorage(',');

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

Вы можете записать в файл весь сценарий Pig Latin и выполнить его с помощью –x command. Предположим, у нас есть сценарий Pig в файле с именемsample_script.pig как показано ниже.

Sample_script.pig

student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING
   PigStorage(',') as (id:int,name:chararray,city:chararray);
  
Dump student;

Теперь вы можете выполнить сценарий в указанном выше файле, как показано ниже.

Локальный режим Режим MapReduce
$ pig -x местный Sample_script.pig $ pig -x mapreduce Sample_script.pig

Note - Мы подробно обсудим, как запустить скрипт Pig в Bach mode И в embedded mode в последующих главах.

После вызова оболочки Grunt вы можете запускать сценарии Pig в оболочке. В дополнение к этому, оболочка Grunt предоставляет ряд полезных команд оболочки и служебных команд. В этой главе объясняются команды оболочки и служебные программы, предоставляемые оболочкой Grunt.

Note - В некоторых частях этой главы такие команды, как Load и Storeиспользуются. Обратитесь к соответствующим главам, чтобы получить подробную информацию о них.

Команды оболочки

Оболочка Grunt Apache Pig в основном используется для написания сценариев Pig Latin. До этого мы можем вызывать любые команды оболочки, используяsh и fs.

Команда sh

С помощью shcommand, мы можем вызывать любые команды оболочки из оболочки Grunt. С помощьюsh из оболочки Grunt, мы не можем выполнять команды, которые являются частью среды оболочки (ex - компакт-диск).

Syntax

Ниже приведен синтаксис sh команда.

grunt> sh shell command parameters

Example

Мы можем призвать ls команду оболочки Linux из оболочки Grunt с помощью shвариант, как показано ниже. В этом примере он перечисляет файлы в/pig/bin/ каталог.

grunt> sh ls
   
pig 
pig_1444799121955.log 
pig.cmd 
pig.py

команда fs

Используя fs command, мы можем вызывать любые команды FsShell из оболочки Grunt.

Syntax

Ниже приведен синтаксис fs команда.

grunt> sh File System command parameters

Example

Мы можем вызвать команду ls HDFS из оболочки Grunt с помощью команды fs. В следующем примере перечислены файлы в корневом каталоге HDFS.

grunt> fs –ls
  
Found 3 items
drwxrwxrwx   - Hadoop supergroup          0 2015-09-08 14:13 Hbase
drwxr-xr-x   - Hadoop supergroup          0 2015-09-09 14:52 seqgen_data
drwxr-xr-x   - Hadoop supergroup          0 2015-09-08 11:30 twitter_data

Таким же образом мы можем вызывать все остальные команды оболочки файловой системы из оболочки Grunt, используя команду fs команда.

Команды утилит

Оболочка Grunt предоставляет набор служебных команд. К ним относятся служебные команды, такие какclear, help, history, quit, и set; и такие команды, какexec, kill, и runдля управления Pig из оболочки Grunt. Ниже приводится описание служебных команд, предоставляемых оболочкой Grunt.

очистить команду

В clear Команда используется для очистки экрана оболочки Grunt.

Syntax

Вы можете очистить экран от grunt shell, используя clear как показано ниже.

grunt> clear

команда помощи

В help command дает вам список команд Pig или свойств Pig.

Usage

Вы можете получить список команд Pig, используя help как показано ниже.

grunt> help

Commands: <pig latin statement>; - See the PigLatin manual for details:
http://hadoop.apache.org/pig
  
File system commands:fs <fs arguments> - Equivalent to Hadoop dfs  command:
http://hadoop.apache.org/common/docs/current/hdfs_shell.html
	 
Diagnostic Commands:describe <alias>[::<alias] - Show the schema for the alias.
Inner aliases can be described as A::B.
    explain [-script <pigscript>] [-out <path>] [-brief] [-dot|-xml] 
       [-param <param_name>=<pCram_value>]
       [-param_file <file_name>] [<alias>] - 
       Show the execution plan to compute the alias or for entire script.
       -script - Explain the entire script.
       -out - Store the output into directory rather than print to stdout.
       -brief - Don't expand nested plans (presenting a smaller graph for overview).
       -dot - Generate the output in .dot format. Default is text format.
       -xml - Generate the output in .xml format. Default is text format.
       -param <param_name - See parameter substitution for details.
       -param_file <file_name> - See parameter substitution for details.
       alias - Alias to explain.
       dump <alias> - Compute the alias and writes the results to stdout.

Utility Commands: exec [-param <param_name>=param_value] [-param_file <file_name>] <script> -
       Execute the script with access to grunt environment including aliases.
       -param <param_name - See parameter substitution for details.
       -param_file <file_name> - See parameter substitution for details.
       script - Script to be executed.
    run [-param <param_name>=param_value] [-param_file <file_name>] <script> -
       Execute the script with access to grunt environment.
		 -param <param_name - See parameter substitution for details.         
       -param_file <file_name> - See parameter substitution for details.
       script - Script to be executed.
    sh  <shell command> - Invoke a shell command.
    kill <job_id> - Kill the hadoop job specified by the hadoop job id.
    set <key> <value> - Provide execution parameters to Pig. Keys and values are case sensitive.
       The following keys are supported:
       default_parallel - Script-level reduce parallelism. Basic input size heuristics used 
       by default.
       debug - Set debug on or off. Default is off.
       job.name - Single-quoted name for jobs. Default is PigLatin:<script name>     
       job.priority - Priority for jobs. Values: very_low, low, normal, high, very_high.
       Default is normal stream.skippath - String that contains the path.
       This is used by streaming any hadoop property.
    help - Display this message.
    history [-n] - Display the list statements in cache.
       -n Hide line numbers.
    quit - Quit the grunt shell.

история Команда

Эта команда отображает список операторов, выполненных / использованных с момента вызова Grunt sell.

Usage

Предположим, мы выполнили три оператора с момента открытия оболочки Grunt.

grunt> customers = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',');
 
grunt> orders = LOAD 'hdfs://localhost:9000/pig_data/orders.txt' USING PigStorage(',');
 
grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',');

Затем, используя history команда выдаст следующий результат.

grunt> history

customers = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(','); 
  
orders = LOAD 'hdfs://localhost:9000/pig_data/orders.txt' USING PigStorage(',');
   
student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',');

установить команду

В set команда используется для отображения / присвоения значений ключам, используемым в Pig.

Usage

Используя эту команду, вы можете установить значения для следующих ключей.

Ключ Описание и значения
default_parallel Вы можете установить количество редукторов для задания карты, передав любое целое число в качестве значения этому ключу.
debug Вы можете выключить или включить средство отладки в Pig, передавая / выключив эту кнопку.
job.name Вы можете задать имя задания для требуемого задания, передав этому ключу строковое значение.
job.priority

Вы можете установить приоритет задания для задания, передав одно из следующих значений этому ключу:

  • very_low
  • low
  • normal
  • high
  • very_high
stream.skippath Для потоковой передачи вы можете установить путь, по которому данные не будут передаваться, передав желаемый путь в виде строки в этот ключ.

команда выхода

Вы можете выйти из оболочки Grunt, используя эту команду.

Usage

Выйдите из оболочки Grunt, как показано ниже.

grunt> quit

Давайте теперь посмотрим на команды, с помощью которых вы можете управлять Apache Pig из оболочки Grunt.

Команда exec

Используя exec , мы можем выполнять скрипты Pig из оболочки Grunt.

Syntax

Ниже приведен синтаксис служебной команды exec.

grunt> exec [–param param_name = param_value] [–param_file file_name] [script]

Example

Предположим, есть файл с именем student.txt в /pig_data/ каталог HDFS со следующим содержимым.

Student.txt

001,Rajiv,Hyderabad
002,siddarth,Kolkata
003,Rajesh,Delhi

Предположим, у нас есть файл сценария с именем sample_script.pig в /pig_data/ каталог HDFS со следующим содержимым.

Sample_script.pig

student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',') 
   as (id:int,name:chararray,city:chararray);
  
Dump student;

Теперь давайте выполним приведенный выше сценарий из оболочки Grunt, используя exec как показано ниже.

grunt> exec /sample_script.pig

Output

В exec команда выполняет сценарий в sample_script.pig. Как указано в сценарии, он загружаетstudent.txt файл в Pig и выдает результат оператора Dump, отображающего следующий контент.

(1,Rajiv,Hyderabad)
(2,siddarth,Kolkata)
(3,Rajesh,Delhi)

команда kill

Вы можете убить задание из оболочки Grunt, используя эту команду.

Syntax

Ниже приведен синтаксис kill команда.

grunt> kill JobId

Example

Предположим, есть запущенное задание Pig с идентификатором Id_0055, вы можете убить его из оболочки Grunt, используя kill команда, как показано ниже.

grunt> kill Id_0055

Команда Run

Вы можете запустить сценарий Pig из оболочки Grunt, используя команду run команда

Syntax

Ниже приведен синтаксис run команда.

grunt> run [–param param_name = param_value] [–param_file file_name] script

Example

Предположим, есть файл с именем student.txt в /pig_data/ каталог HDFS со следующим содержимым.

Student.txt

001,Rajiv,Hyderabad
002,siddarth,Kolkata
003,Rajesh,Delhi

Предположим, у нас есть файл сценария с именем sample_script.pig в локальной файловой системе со следующим содержимым.

Sample_script.pig

student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING
   PigStorage(',') as (id:int,name:chararray,city:chararray);

Теперь давайте запустим приведенный выше сценарий из оболочки Grunt, используя команду run, как показано ниже.

grunt> run /sample_script.pig

Вы можете увидеть вывод скрипта, используя Dump operator как показано ниже.

grunt> Dump;

(1,Rajiv,Hyderabad)
(2,siddarth,Kolkata)
(3,Rajesh,Delhi)

Note - Разница между exec и run команда заключается в том, что если мы используем run, операторы скрипта доступны в истории команд.

Pig Latin - это язык, используемый для анализа данных в Hadoop с помощью Apache Pig. В этой главе мы собираемся обсудить основы Pig Latin, такие как операторы Pig Latin, типы данных, общие и реляционные операторы, а также UDF Pig Latin.

Свинья на латыни - Модель данных

Как обсуждалось в предыдущих главах, модель данных Pig полностью вложена. АRelationявляется самой внешней структурой модели данных Pig Latin. И этоbag где -

  • Сумка - это набор кортежей.
  • Кортеж - это упорядоченный набор полей.
  • Поле - это часть данных.

Свинья на латыни - Statemets

При обработке данных с использованием Pig Latin, statements являются основными конструкциями.

  • Эти утверждения работают с relations. Они включаютexpressions и schemas.

  • Каждый оператор заканчивается точкой с запятой (;).

  • Мы будем выполнять различные операции с помощью операторов, предоставляемых Pig Latin, через операторы.

  • За исключением LOAD и STORE, при выполнении всех других операций операторы Pig Latin принимают отношение в качестве входных данных и создают другое отношение в качестве выходных данных.

  • Как только вы войдете в Loadв оболочке Grunt, будет проведена его семантическая проверка. Чтобы увидеть содержимое схемы, вам нужно использоватьDumpоператор. Только после выполненияdump будет выполнено задание MapReduce по загрузке данных в файловую систему.

пример

Ниже приведен оператор Pig Latin, который загружает данные в Apache Pig.

grunt> Student_data = LOAD 'student_data.txt' USING PigStorage(',')as 
   ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );

Свинья на латыни - Типы данных

В приведенной ниже таблице описаны типы данных Pig Latin.

SN Тип данных Описание и пример
1 int

Представляет 32-разрядное целое число со знаком.

Example : 8

2 долго

Представляет 64-разрядное целое число со знаком.

Example : 5л

3 плавать

Представляет 32-битную плавающую точку со знаком.

Example : 5.5F

4 двойной

Представляет 64-битную плавающую точку.

Example : 10,5

5 Chararray

Представляет массив символов (строку) в формате Unicode UTF-8.

Example : 'точка обучения'

6 Bytearray

Represents a Byte array (blob).

7 Boolean

Represents a Boolean value.

Example : true/ false.

8 Datetime

Represents a date-time.

Example : 1970-01-01T00:00:00.000+00:00

9 Biginteger

Represents a Java BigInteger.

Example : 60708090709

10 Bigdecimal

Represents a Java BigDecimal

Example : 185.98376256272893883

Complex Types
11 Tuple

A tuple is an ordered set of fields.

Example : (raja, 30)

12 Bag

A bag is a collection of tuples.

Example : {(raju,30),(Mohhammad,45)}

13 Map

A Map is a set of key-value pairs.

Example : [ ‘name’#’Raju’, ‘age’#30]

Null Values

Values for all the above data types can be NULL. Apache Pig treats null values in a similar way as SQL does.

A null can be an unknown value or a non-existent value. It is used as a placeholder for optional values. These nulls can occur naturally or can be the result of an operation.

Pig Latin – Arithmetic Operators

The following table describes the arithmetic operators of Pig Latin. Suppose a = 10 and b = 20.

Operator Description Example
+

Addition − Adds values on either side of the operator

a + b will give 30

Subtraction − Subtracts right hand operand from left hand operand

a − b will give −10
*

Multiplication − Multiplies values on either side of the operator

a * b will give 200
/

Division − Divides left hand operand by right hand operand

b / a will give 2
%

Modulus − Divides left hand operand by right hand operand and returns remainder

b % a will give 0
? :

Bincond − Evaluates the Boolean operators. It has three operands as shown below.

variable x = (expression) ? value1 if true : value2 if false.

b = (a == 1)? 20: 30;

if a=1 the value of b is 20.

if a!=1 the value of b is 30.

CASE

WHEN

THEN

ELSE END

Case − The case operator is equivalent to nested bincond operator.

CASE f2 % 2

WHEN 0 THEN 'even'

WHEN 1 THEN 'odd'

END

Pig Latin – Comparison Operators

The following table describes the comparison operators of Pig Latin.

Operator Description Example
==

Equal − Checks if the values of two operands are equal or not; if yes, then the condition becomes true.

(a = b) is not true
!=

Not Equal − Checks if the values of two operands are equal or not. If the values are not equal, then condition becomes true.

(a != b) is true.
>

Greater than − Checks if the value of the left operand is greater than the value of the right operand. If yes, then the condition becomes true.

(a > b) is not true.
<

Less than − Checks if the value of the left operand is less than the value of the right operand. If yes, then the condition becomes true.

(a < b) is true.
>=

Greater than or equal to − Checks if the value of the left operand is greater than or equal to the value of the right operand. If yes, then the condition becomes true.

(a >= b) is not true.
<=

Less than or equal to − Checks if the value of the left operand is less than or equal to the value of the right operand. If yes, then the condition becomes true.

(a <= b) is true.
matches

Pattern matching − Checks whether the string in the left-hand side matches with the constant in the right-hand side.

f1 matches '.*tutorial.*'

Pig Latin – Type Construction Operators

The following table describes the Type construction operators of Pig Latin.

Operator Description Example
()

Tuple constructor operator − This operator is used to construct a tuple.

(Raju, 30)
{}

Bag constructor operator − This operator is used to construct a bag.

{(Raju, 30), (Mohammad, 45)}
[]

Map constructor operator − This operator is used to construct a tuple.

[name#Raja, age#30]

Pig Latin – Relational Operations

The following table describes the relational operators of Pig Latin.

Operator Description
Loading and Storing
LOAD To Load the data from the file system (local/HDFS) into a relation.
STORE To save a relation to the file system (local/HDFS).
Filtering
FILTER To remove unwanted rows from a relation.
DISTINCT To remove duplicate rows from a relation.
FOREACH, GENERATE To generate data transformations based on columns of data.
STREAM To transform a relation using an external program.
Grouping and Joining
JOIN To join two or more relations.
COGROUP To group the data in two or more relations.
GROUP To group the data in a single relation.
CROSS To create the cross product of two or more relations.
Sorting
ORDER To arrange a relation in a sorted order based on one or more fields (ascending or descending).
LIMIT To get a limited number of tuples from a relation.
Combining and Splitting
UNION To combine two or more relations into a single relation.
SPLIT To split a single relation into two or more relations.
Diagnostic Operators
DUMP To print the contents of a relation on the console.
DESCRIBE To describe the schema of a relation.
EXPLAIN To view the logical, physical, or MapReduce execution plans to compute a relation.
ILLUSTRATE To view the step-by-step execution of a series of statements.

In general, Apache Pig works on top of Hadoop. It is an analytical tool that analyzes large datasets that exist in the Hadoop File System. To analyze data using Apache Pig, we have to initially load the data into Apache Pig. This chapter explains how to load data to Apache Pig from HDFS.

Preparing HDFS

In MapReduce mode, Pig reads (loads) data from HDFS and stores the results back in HDFS. Therefore, let us start HDFS and create the following sample data in HDFS.

Student ID First Name Last Name Phone City
001 Rajiv Reddy 9848022337 Hyderabad
002 siddarth Battacharya 9848022338 Kolkata
003 Rajesh Khanna 9848022339 Delhi
004 Preethi Agarwal 9848022330 Pune
005 Trupthi Mohanthy 9848022336 Bhuwaneshwar
006 Archana Mishra 9848022335 Chennai

The above dataset contains personal details like id, first name, last name, phone number and city, of six students.

Step 1: Verifying Hadoop

First of all, verify the installation using Hadoop version command, as shown below.

$ hadoop version

If your system contains Hadoop, and if you have set the PATH variable, then you will get the following output −

Hadoop 2.6.0 
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 
e3496499ecb8d220fba99dc5ed4c99c8f9e33bb1 
Compiled by jenkins on 2014-11-13T21:10Z 
Compiled with protoc 2.5.0 
From source with checksum 18e43357c8f927c0695f1e9522859d6a 
This command was run using /home/Hadoop/hadoop/share/hadoop/common/hadoop
common-2.6.0.jar

Step 2: Starting HDFS

Browse through the sbin directory of Hadoop and start yarn and Hadoop dfs (distributed file system) as shown below.

cd /$Hadoop_Home/sbin/ 
$ start-dfs.sh 
localhost: starting namenode, logging to /home/Hadoop/hadoop/logs/hadoopHadoop-namenode-localhost.localdomain.out 
localhost: starting datanode, logging to /home/Hadoop/hadoop/logs/hadoopHadoop-datanode-localhost.localdomain.out 
Starting secondary namenodes [0.0.0.0] 
starting secondarynamenode, logging to /home/Hadoop/hadoop/logs/hadoop-Hadoopsecondarynamenode-localhost.localdomain.out
 
$ start-yarn.sh 
starting yarn daemons 
starting resourcemanager, logging to /home/Hadoop/hadoop/logs/yarn-Hadoopresourcemanager-localhost.localdomain.out 
localhost: starting nodemanager, logging to /home/Hadoop/hadoop/logs/yarnHadoop-nodemanager-localhost.localdomain.out

Step 3: Create a Directory in HDFS

In Hadoop DFS, you can create directories using the command mkdir. Create a new directory in HDFS with the name Pig_Data in the required path as shown below.

$cd /$Hadoop_Home/bin/ 
$ hdfs dfs -mkdir hdfs://localhost:9000/Pig_Data

Step 4: Placing the data in HDFS

The input file of Pig contains each tuple/record in individual lines. And the entities of the record are separated by a delimiter (In our example we used “,”).

In the local file system, create an input file student_data.txt containing data as shown below.

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

Now, move the file from the local file system to HDFS using put command as shown below. (You can use copyFromLocal command as well.)

$ cd $HADOOP_HOME/bin $ hdfs dfs -put /home/Hadoop/Pig/Pig_Data/student_data.txt dfs://localhost:9000/pig_data/

Verifying the file

You can use the cat command to verify whether the file has been moved into the HDFS, as shown below.

$ cd $HADOOP_HOME/bin
$ hdfs dfs -cat hdfs://localhost:9000/pig_data/student_data.txt

Output

You can see the content of the file as shown below.

15/10/01 12:16:55 WARN util.NativeCodeLoader: Unable to load native-hadoop
library for your platform... using builtin-java classes where applicable
  
001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai

The Load Operator

You can load data into Apache Pig from the file system (HDFS/ Local) using LOAD operator of Pig Latin.

Syntax

The load statement consists of two parts divided by the “=” operator. On the left-hand side, we need to mention the name of the relation where we want to store the data, and on the right-hand side, we have to define how we store the data. Given below is the syntax of the Load operator.

Relation_name = LOAD 'Input file path' USING function as schema;

Where,

  • relation_name − We have to mention the relation in which we want to store the data.

  • Input file path − We have to mention the HDFS directory where the file is stored. (In MapReduce mode)

  • function − We have to choose a function from the set of load functions provided by Apache Pig (BinStorage, JsonLoader, PigStorage, TextLoader).

  • Schema − We have to define the schema of the data. We can define the required schema as follows −

(column1 : data type, column2 : data type, column3 : data type);

Note − We load the data without specifying the schema. In that case, the columns will be addressed as $01, $02, etc… (check).

Example

As an example, let us load the data in student_data.txt in Pig under the schema named Student using the LOAD command.

Start the Pig Grunt Shell

First of all, open the Linux terminal. Start the Pig Grunt shell in MapReduce mode as shown below.

$ Pig –x mapreduce

It will start the Pig Grunt shell as shown below.

15/10/01 12:33:37 INFO pig.ExecTypeProvider: Trying ExecType : LOCAL
15/10/01 12:33:37 INFO pig.ExecTypeProvider: Trying ExecType : MAPREDUCE
15/10/01 12:33:37 INFO pig.ExecTypeProvider: Picked MAPREDUCE as the ExecType

2015-10-01 12:33:38,080 [main] INFO  org.apache.pig.Main - Apache Pig version 0.15.0 (r1682971) compiled Jun 01 2015, 11:44:35
2015-10-01 12:33:38,080 [main] INFO  org.apache.pig.Main - Logging error messages to: /home/Hadoop/pig_1443683018078.log
2015-10-01 12:33:38,242 [main] INFO  org.apache.pig.impl.util.Utils - Default bootup file /home/Hadoop/.pigbootup not found
  
2015-10-01 12:33:39,630 [main]
INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://localhost:9000
 
grunt>

Выполните оператор загрузки

Теперь загрузите данные из файла student_data.txt в Pig, выполнив следующий оператор Pig Latin в оболочке Grunt.

grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' 
   USING PigStorage(',')
   as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, 
   city:chararray );

Ниже приводится описание приведенного выше утверждения.

Имя отношения Мы сохранили данные в схеме student.
Путь к входному файлу Читаем данные из файла student_data.txt, который находится в каталоге / pig_data / HDFS.
Функция хранения Мы использовали PigStorage()функция. Он загружает и хранит данные в виде структурированных текстовых файлов. В качестве параметра требуется разделитель, с помощью которого отделяется каждая сущность кортежа. По умолчанию в качестве параметра используется '\ t'.
схема

Мы сохранили данные, используя следующую схему.

столбец Я бы Имя фамилия Телефон город
тип данных int массив символов массив символов массив символов массив символов

Note - The loadоператор просто загрузит данные в указанное отношение в Pig. Чтобы проверить выполнениеLoad заявление, вы должны использовать Diagnostic Operators которые обсуждаются в следующих главах.

В предыдущей главе мы узнали, как загружать данные в Apache Pig. Вы можете сохранить загруженные данные в файловой системе, используяstoreоператор. В этой главе объясняется, как хранить данные в Apache Pig с помощьюStore оператор.

Синтаксис

Ниже приведен синтаксис оператора Store.

STORE Relation_name INTO ' required_directory_path ' [USING function];

пример

Предположим, у нас есть файл student_data.txt в HDFS со следующим содержимым.

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

И мы прочитали это в отношении student используя оператор LOAD, как показано ниже.

grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' 
   USING PigStorage(',')
   as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, 
   city:chararray );

Теперь давайте сохраним отношение в каталоге HDFS “/pig_Output/” как показано ниже.

grunt> STORE student INTO ' hdfs://localhost:9000/pig_Output/ ' USING PigStorage (',');

Вывод

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

2015-10-05 13:05:05,429 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.
MapReduceLau ncher - 100% complete
2015-10-05 13:05:05,429 [main] INFO  org.apache.pig.tools.pigstats.mapreduce.SimplePigStats - 
Script Statistics:
   
HadoopVersion    PigVersion    UserId    StartedAt             FinishedAt             Features 
2.6.0            0.15.0        Hadoop    2015-10-0 13:03:03    2015-10-05 13:05:05    UNKNOWN  
Success!  
Job Stats (time in seconds): 
JobId          Maps    Reduces    MaxMapTime    MinMapTime    AvgMapTime    MedianMapTime    
job_14459_06    1        0           n/a           n/a           n/a           n/a
MaxReduceTime    MinReduceTime    AvgReduceTime    MedianReducetime    Alias    Feature   
     0                 0                0                0             student  MAP_ONLY 
OutPut folder
hdfs://localhost:9000/pig_Output/ 
 
Input(s): Successfully read 0 records from: "hdfs://localhost:9000/pig_data/student_data.txt"  
Output(s): Successfully stored 0 records in: "hdfs://localhost:9000/pig_Output"  
Counters:
Total records written : 0
Total bytes written : 0
Spillable Memory Manager spill count : 0 
Total bags proactively spilled: 0
Total records proactively spilled: 0
  
Job DAG: job_1443519499159_0006
  
2015-10-05 13:06:06,192 [main] INFO  org.apache.pig.backend.hadoop.executionengine
.mapReduceLayer.MapReduceLau ncher - Success!

Проверка

Вы можете проверить сохраненные данные, как показано ниже.

Шаг 1

Прежде всего, перечислите файлы в каталоге с именем pig_output используя ls как показано ниже.

hdfs dfs -ls 'hdfs://localhost:9000/pig_Output/'
Found 2 items
rw-r--r-   1 Hadoop supergroup          0 2015-10-05 13:03 hdfs://localhost:9000/pig_Output/_SUCCESS
rw-r--r-   1 Hadoop supergroup        224 2015-10-05 13:03 hdfs://localhost:9000/pig_Output/part-m-00000

Вы можете заметить, что два файла были созданы после выполнения store заявление.

Шаг 2

С помощью cat команда, перечислите содержимое файла с именем part-m-00000 как показано ниже.

$ hdfs dfs -cat 'hdfs://localhost:9000/pig_Output/part-m-00000' 
1,Rajiv,Reddy,9848022337,Hyderabad
2,siddarth,Battacharya,9848022338,Kolkata
3,Rajesh,Khanna,9848022339,Delhi
4,Preethi,Agarwal,9848022330,Pune
5,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
6,Archana,Mishra,9848022335,Chennai

В loadоператор просто загрузит данные в указанное отношение в Apache Pig. Чтобы проверить выполнениеLoad заявление, вы должны использовать Diagnostic Operators. Pig Latin предоставляет четыре различных типа диагностических операторов -

  • Оператор дампа
  • Опишите оператора
  • Оператор объяснения
  • Оператор иллюстрации

В этой главе мы обсудим операторы дампа Pig Latin.

Оператор дампа

В DumpОператор используется для запуска операторов Pig Latin и отображения результатов на экране. Обычно используется для отладки.

Синтаксис

Ниже приведен синтаксис Dump оператор.

grunt> Dump Relation_Name

пример

Предположим, у нас есть файл student_data.txt в HDFS со следующим содержимым.

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

И мы прочитали это в отношении student используя оператор LOAD, как показано ниже.

grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' 
   USING PigStorage(',')
   as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, 
   city:chararray );

Теперь давайте распечатаем содержимое отношения, используя Dump operator как показано ниже.

grunt> Dump student

Как только вы выполните вышеуказанное Pig Latinоператор, он запустит задание MapReduce для чтения данных из HDFS. Будет произведен следующий вывод.

2015-10-01 15:05:27,642 [main]
INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 
100% complete
2015-10-01 15:05:27,652 [main]
INFO  org.apache.pig.tools.pigstats.mapreduce.SimplePigStats - Script Statistics:   
HadoopVersion  PigVersion  UserId    StartedAt             FinishedAt       Features             
2.6.0          0.15.0      Hadoop  2015-10-01 15:03:11  2015-10-01 05:27     UNKNOWN
                                                
Success!  
Job Stats (time in seconds):
  
JobId           job_14459_0004
Maps                 1  
Reduces              0  
MaxMapTime          n/a    
MinMapTime          n/a
AvgMapTime          n/a 
MedianMapTime       n/a
MaxReduceTime        0
MinReduceTime        0  
AvgReduceTime        0
MedianReducetime     0
Alias             student 
Feature           MAP_ONLY        
Outputs           hdfs://localhost:9000/tmp/temp580182027/tmp757878456,

Input(s): Successfully read 0 records from: "hdfs://localhost:9000/pig_data/
student_data.txt"
  
Output(s): Successfully stored 0 records in: "hdfs://localhost:9000/tmp/temp580182027/
tmp757878456"  

Counters: Total records written : 0 Total bytes written : 0 Spillable Memory Manager 
spill count : 0Total bags proactively spilled: 0 Total records proactively spilled: 0  

Job DAG: job_1443519499159_0004
  
2015-10-01 15:06:28,403 [main]
INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLau ncher - Success!
2015-10-01 15:06:28,441 [main] INFO  org.apache.pig.data.SchemaTupleBackend - 
Key [pig.schematuple] was not set... will not generate code.
2015-10-01 15:06:28,485 [main]
INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths 
to process : 1
2015-10-01 15:06:28,485 [main]
INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths
to process : 1

(1,Rajiv,Reddy,9848022337,Hyderabad) (2,siddarth,Battacharya,9848022338,Kolkata) (3,Rajesh,Khanna,9848022339,Delhi) (4,Preethi,Agarwal,9848022330,Pune) (5,Trupthi,Mohanthy,9848022336,Bhuwaneshwar) (6,Archana,Mishra,9848022335,Chennai)

В describe Оператор используется для просмотра схемы отношения.

Синтаксис

Синтаксис describe оператор выглядит следующим образом -

grunt> Describe Relation_name

пример

Предположим, у нас есть файл student_data.txt в HDFS со следующим содержимым.

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

И мы прочитали это в отношении student используя оператор LOAD, как показано ниже.

grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' USING PigStorage(',')
   as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );

Теперь опишем отношение, названное student и проверьте схему, как показано ниже.

grunt> describe student;

Вывод

Как только вы выполните вышеуказанное Pig Latin оператор, он выдаст следующий результат.

grunt> student: { id: int,firstname: chararray,lastname: chararray,phone: chararray,city: chararray }

В explain Оператор используется для отображения логического, физического и MapReduce планов выполнения отношения.

Синтаксис

Ниже приведен синтаксис explain оператор.

grunt> explain Relation_name;

пример

Предположим, у нас есть файл student_data.txt в HDFS со следующим содержимым.

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

И мы прочитали это в отношении student используя оператор LOAD, как показано ниже.

grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' USING PigStorage(',')
   as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );

Теперь давайте объясним отношение с именем student, используя explain оператор, как показано ниже.

grunt> explain student;

Вывод

Будет произведен следующий вывод.

$ explain student;

2015-10-05 11:32:43,660 [main]
2015-10-05 11:32:43,660 [main] INFO  org.apache.pig.newplan.logical.optimizer
.LogicalPlanOptimizer -
{RULES_ENABLED=[AddForEach, ColumnMapKeyPrune, ConstantCalculator,
GroupByConstParallelSetter, LimitOptimizer, LoadTypeCastInserter, MergeFilter, 
MergeForEach, PartitionFilterOptimizer, PredicatePushdownOptimizer,
PushDownForEachFlatten, PushUpFilter, SplitFilter, StreamTypeCastInserter]}  
#-----------------------------------------------
# New Logical Plan: 
#-----------------------------------------------
student: (Name: LOStore Schema:
id#31:int,firstname#32:chararray,lastname#33:chararray,phone#34:chararray,city#
35:chararray)
| 
|---student: (Name: LOForEach Schema:
id#31:int,firstname#32:chararray,lastname#33:chararray,phone#34:chararray,city#
35:chararray)
    |   |
    |   (Name: LOGenerate[false,false,false,false,false] Schema:
id#31:int,firstname#32:chararray,lastname#33:chararray,phone#34:chararray,city#
35:chararray)ColumnPrune:InputUids=[34, 35, 32, 33,
31]ColumnPrune:OutputUids=[34, 35, 32, 33, 31]
    |   |   | 
    |   |   (Name: Cast Type: int Uid: 31) 
    |   |   |     |   |   |---id:(Name: Project Type: bytearray Uid: 31 Input: 0 Column: (*))
    |   |   |     
    |   |   (Name: Cast Type: chararray Uid: 32)
    |   |   | 
    |   |   |---firstname:(Name: Project Type: bytearray Uid: 32 Input: 1
Column: (*))
    |   |   |
    |   |   (Name: Cast Type: chararray Uid: 33)
    |   |   |
    |   |   |---lastname:(Name: Project Type: bytearray Uid: 33 Input: 2
	 Column: (*))
    |   |   | 
    |   |   (Name: Cast Type: chararray Uid: 34)
    |   |   |  
    |   |   |---phone:(Name: Project Type: bytearray Uid: 34 Input: 3 Column:
(*))
    |   |   | 
    |   |   (Name: Cast Type: chararray Uid: 35)
    |   |   |  
    |   |   |---city:(Name: Project Type: bytearray Uid: 35 Input: 4 Column:
(*))
    |   | 
    |   |---(Name: LOInnerLoad[0] Schema: id#31:bytearray)
    |   |  
    |   |---(Name: LOInnerLoad[1] Schema: firstname#32:bytearray)
    |   |
    |   |---(Name: LOInnerLoad[2] Schema: lastname#33:bytearray)
    |   |
    |   |---(Name: LOInnerLoad[3] Schema: phone#34:bytearray)
    |   | 
    |   |---(Name: LOInnerLoad[4] Schema: city#35:bytearray)
    |
    |---student: (Name: LOLoad Schema: 
id#31:bytearray,firstname#32:bytearray,lastname#33:bytearray,phone#34:bytearray
,city#35:bytearray)RequiredFields:null 
#-----------------------------------------------
# Physical Plan: #-----------------------------------------------
student: Store(fakefile:org.apache.pig.builtin.PigStorage) - scope-36
| 
|---student: New For Each(false,false,false,false,false)[bag] - scope-35
    |   |
    |   Cast[int] - scope-21
    |   |
    |   |---Project[bytearray][0] - scope-20
    |   |  
    |   Cast[chararray] - scope-24
    |   |
    |   |---Project[bytearray][1] - scope-23
    |   | 
    |   Cast[chararray] - scope-27
    |   |  
    |   |---Project[bytearray][2] - scope-26 
    |   |  
    |   Cast[chararray] - scope-30 
    |   |  
    |   |---Project[bytearray][3] - scope-29
    |   |
    |   Cast[chararray] - scope-33
    |   | 
    |   |---Project[bytearray][4] - scope-32
    | 
    |---student: Load(hdfs://localhost:9000/pig_data/student_data.txt:PigStorage(',')) - scope19
2015-10-05 11:32:43,682 [main]
INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MRCompiler - 
File concatenation threshold: 100 optimistic? false
2015-10-05 11:32:43,684 [main]
INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MultiQueryOp timizer - 
MR plan size before optimization: 1 2015-10-05 11:32:43,685 [main]
INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.
MultiQueryOp timizer - MR plan size after optimization: 1 
#--------------------------------------------------
# Map Reduce Plan                                   
#--------------------------------------------------
MapReduce node scope-37
Map Plan
student: Store(fakefile:org.apache.pig.builtin.PigStorage) - scope-36
|
|---student: New For Each(false,false,false,false,false)[bag] - scope-35
    |   |
    |   Cast[int] - scope-21 
    |   |
    |   |---Project[bytearray][0] - scope-20
    |   |
    |   Cast[chararray] - scope-24
    |   |
    |   |---Project[bytearray][1] - scope-23
    |   |
    |   Cast[chararray] - scope-27
    |   | 
    |   |---Project[bytearray][2] - scope-26 
    |   | 
    |   Cast[chararray] - scope-30 
    |   |  
    |   |---Project[bytearray][3] - scope-29 
    |   | 
    |   Cast[chararray] - scope-33
    |   | 
    |   |---Project[bytearray][4] - scope-32 
    |  
    |---student:
Load(hdfs://localhost:9000/pig_data/student_data.txt:PigStorage(',')) - scope
19-------- Global sort: false
 ----------------

В illustrate Оператор дает вам пошаговое выполнение последовательности операторов.

Синтаксис

Ниже приведен синтаксис illustrate оператор.

grunt> illustrate Relation_name;

пример

Предположим, у нас есть файл student_data.txt в HDFS со следующим содержимым.

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata 
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune 
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

И мы прочитали это в отношении student используя оператор LOAD, как показано ниже.

grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' USING PigStorage(',')
   as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );

Теперь давайте проиллюстрируем отношение с именем student, как показано ниже.

grunt> illustrate student;

Вывод

Выполнив вышеуказанный оператор, вы получите следующий результат.

grunt> illustrate student;

INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigMapOnly$M ap - Aliases
being processed per job phase (AliasName[line,offset]): M: student[1,10] C:  R:
---------------------------------------------------------------------------------------------
|student | id:int | firstname:chararray | lastname:chararray | phone:chararray | city:chararray |
--------------------------------------------------------------------------------------------- 
|        | 002    | siddarth            | Battacharya        | 9848022338      | Kolkata        |
---------------------------------------------------------------------------------------------

В GROUPОператор используется для группировки данных в одно или несколько отношений. Он собирает данные с одинаковым ключом.

Синтаксис

Ниже приведен синтаксис group оператор.

grunt> Group_data = GROUP Relation_name BY age;

пример

Предположим, у нас есть файл с именем student_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi
004,Preethi,Agarwal,21,9848022330,Pune
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar
006,Archana,Mishra,23,9848022335,Chennai
007,Komal,Nayak,24,9848022334,trivendram
008,Bharathi,Nambiayar,24,9848022333,Chennai

И мы загрузили этот файл в Apache Pig с именем отношения student_details как показано ниже.

grunt> student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray, age:int, phone:chararray, city:chararray);

Теперь давайте сгруппируем записи / кортежи в отношении по возрасту, как показано ниже.

grunt> group_data = GROUP student_details by age;

Проверка

Проверить связь group_data используя DUMP оператор, как показано ниже.

grunt> Dump group_data;

Вывод

Затем вы получите вывод, отображающий содержимое отношения с именем group_dataкак показано ниже. Здесь вы можете заметить, что полученная схема имеет два столбца -

  • Один age, по которым мы сгруппировали отношение.

  • Другой - это bag, который содержит группу кортежей, записи учеников соответствующего возраста.

(21,{(4,Preethi,Agarwal,21,9848022330,Pune),(1,Rajiv,Reddy,21,9848022337,Hydera bad)})
(22,{(3,Rajesh,Khanna,22,9848022339,Delhi),(2,siddarth,Battacharya,22,984802233 8,Kolkata)})
(23,{(6,Archana,Mishra,23,9848022335,Chennai),(5,Trupthi,Mohanthy,23,9848022336 ,Bhuwaneshwar)})
(24,{(8,Bharathi,Nambiayar,24,9848022333,Chennai),(7,Komal,Nayak,24,9848022334, trivendram)})

Вы можете увидеть схему таблицы после группировки данных с помощью describe как показано ниже.

grunt> Describe group_data;
  
group_data: {group: int,student_details: {(id: int,firstname: chararray,
               lastname: chararray,age: int,phone: chararray,city: chararray)}}

Таким же образом вы можете получить образец иллюстрации схемы, используя illustrate как показано ниже.

$ Illustrate group_data;

Он выдаст следующий результат -

------------------------------------------------------------------------------------------------- 
|group_data|  group:int | student_details:bag{:tuple(id:int,firstname:chararray,lastname:chararray,age:int,phone:chararray,city:chararray)}|
------------------------------------------------------------------------------------------------- 
|          |     21     | { 4, Preethi, Agarwal, 21, 9848022330, Pune), (1, Rajiv, Reddy, 21, 9848022337, Hyderabad)}| 
|          |     2      | {(2,siddarth,Battacharya,22,9848022338,Kolkata),(003,Rajesh,Khanna,22,9848022339,Delhi)}| 
-------------------------------------------------------------------------------------------------

Группировка по нескольким столбцам

Сгруппируем отношения по возрасту и городу, как показано ниже.

grunt> group_multiple = GROUP student_details by (age, city);

Вы можете проверить содержимое отношения с именем group_multiple используя оператор дампа, как показано ниже.

grunt> Dump group_multiple; 
  
((21,Pune),{(4,Preethi,Agarwal,21,9848022330,Pune)})
((21,Hyderabad),{(1,Rajiv,Reddy,21,9848022337,Hyderabad)})
((22,Delhi),{(3,Rajesh,Khanna,22,9848022339,Delhi)})
((22,Kolkata),{(2,siddarth,Battacharya,22,9848022338,Kolkata)})
((23,Chennai),{(6,Archana,Mishra,23,9848022335,Chennai)})
((23,Bhuwaneshwar),{(5,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar)})
((24,Chennai),{(8,Bharathi,Nambiayar,24,9848022333,Chennai)})
(24,trivendram),{(7,Komal,Nayak,24,9848022334,trivendram)})

Сгруппировать все

Вы можете сгруппировать отношение по всем столбцам, как показано ниже.

grunt> group_all = GROUP student_details All;

Теперь проверим содержание отношения group_all как показано ниже.

grunt> Dump group_all;  
  
(all,{(8,Bharathi,Nambiayar,24,9848022333,Chennai),(7,Komal,Nayak,24,9848022334 ,trivendram), 
(6,Archana,Mishra,23,9848022335,Chennai),(5,Trupthi,Mohanthy,23,9848022336,Bhuw aneshwar), 
(4,Preethi,Agarwal,21,9848022330,Pune),(3,Rajesh,Khanna,22,9848022339,Delhi), 
(2,siddarth,Battacharya,22,9848022338,Kolkata),(1,Rajiv,Reddy,21,9848022337,Hyd erabad)})

В COGROUPОператор работает более или менее так же, как оператор GROUP . Единственная разница между двумя операторами заключается в том, чтоgroup оператор обычно используется с одним отношением, а оператор cogroup Оператор используется в операторах, включающих два или более отношений.

Группировка двух отношений с помощью Cogroup

Предположим, что у нас есть два файла, а именно student_details.txt и employee_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi
004,Preethi,Agarwal,21,9848022330,Pune
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar
006,Archana,Mishra,23,9848022335,Chennai
007,Komal,Nayak,24,9848022334,trivendram
008,Bharathi,Nambiayar,24,9848022333,Chennai

employee_details.txt

001,Robin,22,newyork 
002,BOB,23,Kolkata 
003,Maya,23,Tokyo 
004,Sara,25,London 
005,David,23,Bhuwaneshwar 
006,Maggy,22,Chennai

И мы загрузили эти файлы в Pig с именами отношений student_details и employee_details соответственно, как показано ниже.

grunt> student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray, age:int, phone:chararray, city:chararray); 
  
grunt> employee_details = LOAD 'hdfs://localhost:9000/pig_data/employee_details.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, city:chararray);

Теперь сгруппируем записи / кортежи отношений student_details и employee_details с ключевым возрастом, как показано ниже.

grunt> cogroup_data = COGROUP student_details by age, employee_details by age;

Проверка

Проверить связь cogroup_data используя DUMP оператор, как показано ниже.

grunt> Dump cogroup_data;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения с именем cogroup_data как показано ниже.

(21,{(4,Preethi,Agarwal,21,9848022330,Pune), (1,Rajiv,Reddy,21,9848022337,Hyderabad)}, 
   {    })  
(22,{ (3,Rajesh,Khanna,22,9848022339,Delhi), (2,siddarth,Battacharya,22,9848022338,Kolkata) },  
   { (6,Maggy,22,Chennai),(1,Robin,22,newyork) })  
(23,{(6,Archana,Mishra,23,9848022335,Chennai),(5,Trupthi,Mohanthy,23,9848022336 ,Bhuwaneshwar)}, 
   {(5,David,23,Bhuwaneshwar),(3,Maya,23,Tokyo),(2,BOB,23,Kolkata)}) 
(24,{(8,Bharathi,Nambiayar,24,9848022333,Chennai),(7,Komal,Nayak,24,9848022334, trivendram)}, 
   { })  
(25,{   }, 
   {(4,Sara,25,London)})

В cogroup Оператор группирует кортежи из каждого отношения в соответствии с возрастом, где каждая группа отображает определенное значение возраста.

Например, если мы рассмотрим 1-й кортеж результата, он сгруппирован по возрасту 21. И он содержит две сумки -

  • первый мешок содержит все кортежи из первого отношения (student_details в данном случае) в возрасте 21 года, и

  • второй пакет содержит все кортежи из второго отношения (employee_details в данном случае) в возрасте 21 года.

Если в отношении нет кортежей, имеющих возрастное значение 21, оно возвращает пустой мешок.

В JOINОператор используется для объединения записей из двух или более отношений. При выполнении операции соединения мы объявляем один (или группу) кортежей из каждого отношения в качестве ключей. Когда эти ключи совпадают, совпадают два конкретных кортежа, иначе записи удаляются. Соединения могут быть следующих типов -

  • Self-join
  • Inner-join
  • Внешнее соединение - левое соединение, правое соединение и полное соединение

В этой главе на примерах объясняется, как использовать оператор соединения в Pig Latin. Предположим, что у нас есть два файла, а именноcustomers.txt и orders.txt в /pig_data/ каталог HDFS, как показано ниже.

customers.txt

1,Ramesh,32,Ahmedabad,2000.00
2,Khilan,25,Delhi,1500.00
3,kaushik,23,Kota,2000.00
4,Chaitali,25,Mumbai,6500.00 
5,Hardik,27,Bhopal,8500.00
6,Komal,22,MP,4500.00
7,Muffy,24,Indore,10000.00

orders.txt

102,2009-10-08 00:00:00,3,3000
100,2009-10-08 00:00:00,3,1500
101,2009-11-20 00:00:00,2,1560
103,2008-05-20 00:00:00,4,2060

И мы загрузили эти два файла в Pig с отношениями customers и orders как показано ниже.

grunt> customers = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, address:chararray, salary:int);
  
grunt> orders = LOAD 'hdfs://localhost:9000/pig_data/orders.txt' USING PigStorage(',')
   as (oid:int, date:chararray, customer_id:int, amount:int);

Давайте теперь выполним различные операции соединения с этими двумя отношениями.

Самостоятельно - присоединиться

Self-join используется для соединения таблицы с самой собой, как если бы таблица была двумя отношениями, временно переименовывая по крайней мере одно отношение.

Как правило, в Apache Pig для выполнения самоподключения мы загружаем одни и те же данные несколько раз под разными псевдонимами (именами). Поэтому загрузим содержимое файлаcustomers.txt в виде двух таблиц, как показано ниже.

grunt> customers1 = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, address:chararray, salary:int);
  
grunt> customers2 = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, address:chararray, salary:int);

Синтаксис

Ниже приведен синтаксис выполнения self-join операция с использованием JOIN оператор.

grunt> Relation3_name = JOIN Relation1_name BY key, Relation2_name BY key ;

пример

Давайте выполним self-join операция по отношению customers, объединив два отношения customers1 и customers2 как показано ниже.

grunt> customers3 = JOIN customers1 BY id, customers2 BY id;

Проверка

Проверить связь customers3 используя DUMP оператор, как показано ниже.

grunt> Dump customers3;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения customers.

(1,Ramesh,32,Ahmedabad,2000,1,Ramesh,32,Ahmedabad,2000)
(2,Khilan,25,Delhi,1500,2,Khilan,25,Delhi,1500)
(3,kaushik,23,Kota,2000,3,kaushik,23,Kota,2000)
(4,Chaitali,25,Mumbai,6500,4,Chaitali,25,Mumbai,6500)
(5,Hardik,27,Bhopal,8500,5,Hardik,27,Bhopal,8500)
(6,Komal,22,MP,4500,6,Komal,22,MP,4500)
(7,Muffy,24,Indore,10000,7,Muffy,24,Indore,10000)

Внутреннее соединение

Inner Joinиспользуется довольно часто; это также упоминается какequijoin. Внутреннее соединение возвращает строки, если в обеих таблицах есть совпадения.

Он создает новое отношение, комбинируя значения столбцов двух отношений (скажем, A и B) на основе предиката соединения. Запрос сравнивает каждую строку A с каждой строкой B, чтобы найти все пары строк, которые удовлетворяют предикату соединения. Когда предикат соединения удовлетворяется, значения столбцов для каждой совпавшей пары строк A и B объединяются в строку результата.

Синтаксис

Вот синтаксис выполнения inner join операция с использованием JOIN оператор.

grunt> result = JOIN relation1 BY columnname, relation2 BY columnname;

пример

Давайте выполним inner join операция над двумя отношениями customers и orders как показано ниже.

grunt> coustomer_orders = JOIN customers BY id, orders BY customer_id;

Проверка

Проверить связь coustomer_orders используя DUMP оператор, как показано ниже.

grunt> Dump coustomer_orders;

Вывод

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

(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)

Note -

Внешнее соединение : в отличие от внутреннего соединения,outer joinвозвращает все строки хотя бы из одного отношения. Операция внешнего соединения выполняется тремя способами:

  • Левое внешнее соединение
  • Правое внешнее соединение
  • Полное внешнее соединение

Левое внешнее соединение

В left outer Join операция возвращает все строки из левой таблицы, даже если в правом отношении нет совпадений.

Синтаксис

Ниже приведен синтаксис выполнения left outer join операция с использованием JOIN оператор.

grunt> Relation3_name = JOIN Relation1_name BY id LEFT OUTER, Relation2_name BY customer_id;

пример

Давайте выполним операцию левого внешнего соединения для двух отношений клиентов и заказов, как показано ниже.

grunt> outer_left = JOIN customers BY id LEFT OUTER, orders BY customer_id;

Проверка

Проверить связь outer_left используя DUMP оператор, как показано ниже.

grunt> Dump outer_left;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения outer_left.

(1,Ramesh,32,Ahmedabad,2000,,,,)
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)
(5,Hardik,27,Bhopal,8500,,,,)
(6,Komal,22,MP,4500,,,,)
(7,Muffy,24,Indore,10000,,,,)

Правое внешнее соединение

В right outer join операция возвращает все строки из правой таблицы, даже если в левой таблице нет совпадений.

Синтаксис

Ниже приведен синтаксис выполнения right outer join операция с использованием JOIN оператор.

grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;

пример

Давайте выполним right outer join операция над двумя отношениями customers и orders как показано ниже.

grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;

Проверка

Проверить связь outer_right используя DUMP оператор, как показано ниже.

grunt> Dump outer_right

Вывод

Он выдаст следующий результат, отображающий содержимое отношения outer_right.

(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)

Полное внешнее соединение

В full outer join операция возвращает строки, когда есть совпадение в одном из отношений.

Синтаксис

Ниже приведен синтаксис выполнения full outer join используя JOIN оператор.

grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;

пример

Давайте выполним full outer join операция над двумя отношениями customers и orders как показано ниже.

grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;

Проверка

Проверить связь outer_full используя DUMP оператор, как показано ниже.

grun> Dump outer_full;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения outer_full.

(1,Ramesh,32,Ahmedabad,2000,,,,)
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)
(5,Hardik,27,Bhopal,8500,,,,)
(6,Komal,22,MP,4500,,,,)
(7,Muffy,24,Indore,10000,,,,)

Использование нескольких ключей

Мы можем выполнить операцию JOIN, используя несколько ключей.

Синтаксис

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

grunt> Relation3_name = JOIN Relation2_name BY (key1, key2), Relation3_name BY (key1, key2);

Предположим, что у нас есть два файла, а именно employee.txt и employee_contact.txt в /pig_data/ каталог HDFS, как показано ниже.

employee.txt

001,Rajiv,Reddy,21,programmer,003
002,siddarth,Battacharya,22,programmer,003
003,Rajesh,Khanna,22,programmer,003
004,Preethi,Agarwal,21,programmer,003
005,Trupthi,Mohanthy,23,programmer,003
006,Archana,Mishra,23,programmer,003
007,Komal,Nayak,24,teamlead,002
008,Bharathi,Nambiayar,24,manager,001

employee_contact.txt

001,9848022337,[email protected],Hyderabad,003
002,9848022338,[email protected],Kolkata,003
003,9848022339,[email protected],Delhi,003
004,9848022330,[email protected],Pune,003
005,9848022336,[email protected],Bhuwaneshwar,003
006,9848022335,[email protected],Chennai,003
007,9848022334,[email protected],trivendram,002
008,9848022333,[email protected],Chennai,001

И мы загрузили эти два файла в Pig с отношениями employee и employee_contact как показано ниже.

grunt> employee = LOAD 'hdfs://localhost:9000/pig_data/employee.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray, age:int, designation:chararray, jobid:int);
  
grunt> employee_contact = LOAD 'hdfs://localhost:9000/pig_data/employee_contact.txt' USING PigStorage(',') 
   as (id:int, phone:chararray, email:chararray, city:chararray, jobid:int);

Теперь давайте объединим содержимое этих двух отношений, используя JOIN оператор, как показано ниже.

grunt> emp = JOIN employee BY (id,jobid), employee_contact BY (id,jobid);

Проверка

Проверить связь emp используя DUMP оператор, как показано ниже.

grunt> Dump emp;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения с именем emp как показано ниже.

(1,Rajiv,Reddy,21,programmer,113,1,9848022337,[email protected],Hyderabad,113)
(2,siddarth,Battacharya,22,programmer,113,2,9848022338,[email protected],Kolka ta,113)  
(3,Rajesh,Khanna,22,programmer,113,3,9848022339,[email protected],Delhi,113)  
(4,Preethi,Agarwal,21,programmer,113,4,9848022330,[email protected],Pune,113)  
(5,Trupthi,Mohanthy,23,programmer,113,5,9848022336,[email protected],Bhuwaneshw ar,113)  
(6,Archana,Mishra,23,programmer,113,6,9848022335,[email protected],Chennai,113)  
(7,Komal,Nayak,24,teamlead,112,7,9848022334,[email protected],trivendram,112)  
(8,Bharathi,Nambiayar,24,manager,111,8,9848022333,[email protected],Chennai,111)

В CROSSОператор вычисляет перекрестное произведение двух или более отношений. В этой главе на примере объясняется, как использовать оператор перекрестия в Pig Latin.

Синтаксис

Ниже приведен синтаксис CROSS оператор.

grunt> Relation3_name = CROSS Relation1_name, Relation2_name;

пример

Предположим, что у нас есть два файла, а именно customers.txt и orders.txt в /pig_data/ каталог HDFS, как показано ниже.

customers.txt

1,Ramesh,32,Ahmedabad,2000.00
2,Khilan,25,Delhi,1500.00
3,kaushik,23,Kota,2000.00
4,Chaitali,25,Mumbai,6500.00
5,Hardik,27,Bhopal,8500.00
6,Komal,22,MP,4500.00
7,Muffy,24,Indore,10000.00

orders.txt

102,2009-10-08 00:00:00,3,3000
100,2009-10-08 00:00:00,3,1500
101,2009-11-20 00:00:00,2,1560
103,2008-05-20 00:00:00,4,2060

И мы загрузили эти два файла в Pig с отношениями customers и orders как показано ниже.

grunt> customers = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, address:chararray, salary:int);
  
grunt> orders = LOAD 'hdfs://localhost:9000/pig_data/orders.txt' USING PigStorage(',')
   as (oid:int, date:chararray, customer_id:int, amount:int);

Давайте теперь получим перекрестное произведение этих двух отношений, используя cross для этих двух отношений, как показано ниже.

grunt> cross_data = CROSS customers, orders;

Проверка

Проверить связь cross_data используя DUMP оператор, как показано ниже.

grunt> Dump cross_data;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения cross_data.

(7,Muffy,24,Indore,10000,103,2008-05-20 00:00:00,4,2060) 
(7,Muffy,24,Indore,10000,101,2009-11-20 00:00:00,2,1560) 
(7,Muffy,24,Indore,10000,100,2009-10-08 00:00:00,3,1500) 
(7,Muffy,24,Indore,10000,102,2009-10-08 00:00:00,3,3000) 
(6,Komal,22,MP,4500,103,2008-05-20 00:00:00,4,2060) 
(6,Komal,22,MP,4500,101,2009-11-20 00:00:00,2,1560) 
(6,Komal,22,MP,4500,100,2009-10-08 00:00:00,3,1500) 
(6,Komal,22,MP,4500,102,2009-10-08 00:00:00,3,3000) 
(5,Hardik,27,Bhopal,8500,103,2008-05-20 00:00:00,4,2060) 
(5,Hardik,27,Bhopal,8500,101,2009-11-20 00:00:00,2,1560) 
(5,Hardik,27,Bhopal,8500,100,2009-10-08 00:00:00,3,1500) 
(5,Hardik,27,Bhopal,8500,102,2009-10-08 00:00:00,3,3000) 
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060) 
(4,Chaitali,25,Mumbai,6500,101,2009-20 00:00:00,4,2060) 
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560) 
(2,Khilan,25,Delhi,1500,100,2009-10-08 00:00:00,3,1500) 
(2,Khilan,25,Delhi,1500,102,2009-10-08 00:00:00,3,3000) 
(1,Ramesh,32,Ahmedabad,2000,103,2008-05-20 00:00:00,4,2060) 
(1,Ramesh,32,Ahmedabad,2000,101,2009-11-20 00:00:00,2,1560) 
(1,Ramesh,32,Ahmedabad,2000,100,2009-10-08 00:00:00,3,1500) 
(1,Ramesh,32,Ahmedabad,2000,102,2009-10-08 00:00:00,3,3000)-11-20 00:00:00,2,1560) 
(4,Chaitali,25,Mumbai,6500,100,2009-10-08 00:00:00,3,1500) 
(4,Chaitali,25,Mumbai,6500,102,2009-10-08 00:00:00,3,3000) 
(3,kaushik,23,Kota,2000,103,2008-05-20 00:00:00,4,2060) 
(3,kaushik,23,Kota,2000,101,2009-11-20 00:00:00,2,1560) 
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500) 
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000) 
(2,Khilan,25,Delhi,1500,103,2008-05-20 00:00:00,4,2060) 
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560) 
(2,Khilan,25,Delhi,1500,100,2009-10-08 00:00:00,3,1500)
(2,Khilan,25,Delhi,1500,102,2009-10-08 00:00:00,3,3000) 
(1,Ramesh,32,Ahmedabad,2000,103,2008-05-20 00:00:00,4,2060) 
(1,Ramesh,32,Ahmedabad,2000,101,2009-11-20 00:00:00,2,1560) 
(1,Ramesh,32,Ahmedabad,2000,100,2009-10-08 00:00:00,3,1500) 
(1,Ramesh,32,Ahmedabad,2000,102,2009-10-08 00:00:00,3,3000)

В UNIONОператор Pig Latin используется для объединения содержимого двух отношений. Чтобы выполнить операцию UNION для двух отношений, их столбцы и домены должны быть идентичными.

Синтаксис

Ниже приведен синтаксис UNION оператор.

grunt> Relation_name3 = UNION Relation_name1, Relation_name2;

пример

Предположим, что у нас есть два файла, а именно student_data1.txt и student_data2.txt в /pig_data/ каталог HDFS, как показано ниже.

Student_data1.txt

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

Student_data2.txt

7,Komal,Nayak,9848022334,trivendram.
8,Bharathi,Nambiayar,9848022333,Chennai.

И мы загрузили эти два файла в Pig с отношениями student1 и student2 как показано ниже.

grunt> student1 = LOAD 'hdfs://localhost:9000/pig_data/student_data1.txt' USING PigStorage(',') 
   as (id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray); 
 
grunt> student2 = LOAD 'hdfs://localhost:9000/pig_data/student_data2.txt' USING PigStorage(',') 
   as (id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray);

Давайте теперь объединим содержимое этих двух отношений, используя UNION оператор, как показано ниже.

grunt> student = UNION student1, student2;

Проверка

Проверить связь student используя DUMP оператор, как показано ниже.

grunt> Dump student;

Вывод

Он отобразит следующий вывод, отображающий содержимое отношения student.

(1,Rajiv,Reddy,9848022337,Hyderabad) (2,siddarth,Battacharya,9848022338,Kolkata)
(3,Rajesh,Khanna,9848022339,Delhi)
(4,Preethi,Agarwal,9848022330,Pune) 
(5,Trupthi,Mohanthy,9848022336,Bhuwaneshwar)
(6,Archana,Mishra,9848022335,Chennai) 
(7,Komal,Nayak,9848022334,trivendram) 
(8,Bharathi,Nambiayar,9848022333,Chennai)

В SPLIT Оператор используется для разделения отношения на два или более отношений.

Синтаксис

Ниже приведен синтаксис SPLIT оператор.

grunt> SPLIT Relation1_name INTO Relation2_name IF (condition1), Relation2_name (condition2),

пример

Предположим, у нас есть файл с именем student_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi 
004,Preethi,Agarwal,21,9848022330,Pune 
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar 
006,Archana,Mishra,23,9848022335,Chennai 
007,Komal,Nayak,24,9848022334,trivendram 
008,Bharathi,Nambiayar,24,9848022333,Chennai

И мы загрузили этот файл в Pig с именем отношения student_details как показано ниже.

student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray, age:int, phone:chararray, city:chararray);

Давайте теперь разделим отношение на два, в одном перечисляются сотрудники в возрасте до 23 лет, а в другом - сотрудники в возрасте от 22 до 25 лет.

SPLIT student_details into student_details1 if age<23, student_details2 if (22<age and age>25);

Проверка

Проверить отношения student_details1 и student_details2 используя DUMP оператор, как показано ниже.

grunt> Dump student_details1;  

grunt> Dump student_details2;

Вывод

Он выдаст следующий результат, отображающий содержимое отношений student_details1 и student_details2 соответственно.

grunt> Dump student_details1; 
(1,Rajiv,Reddy,21,9848022337,Hyderabad) 
(2,siddarth,Battacharya,22,9848022338,Kolkata)
(3,Rajesh,Khanna,22,9848022339,Delhi) 
(4,Preethi,Agarwal,21,9848022330,Pune)
  
grunt> Dump student_details2; 
(5,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar) 
(6,Archana,Mishra,23,9848022335,Chennai) 
(7,Komal,Nayak,24,9848022334,trivendram) 
(8,Bharathi,Nambiayar,24,9848022333,Chennai)

В FILTER Оператор используется для выбора требуемых кортежей из отношения на основе условия.

Синтаксис

Ниже приведен синтаксис FILTER оператор.

grunt> Relation2_name = FILTER Relation1_name BY (condition);

пример

Предположим, у нас есть файл с именем student_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi 
004,Preethi,Agarwal,21,9848022330,Pune 
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar 
006,Archana,Mishra,23,9848022335,Chennai 
007,Komal,Nayak,24,9848022334,trivendram 
008,Bharathi,Nambiayar,24,9848022333,Chennai

И мы загрузили этот файл в Pig с именем отношения student_details как показано ниже.

grunt> student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray, age:int, phone:chararray, city:chararray);

Давайте теперь воспользуемся оператором Filter, чтобы получить подробную информацию о студентах из города Ченнаи.

filter_data = FILTER student_details BY city == 'Chennai';

Проверка

Проверить связь filter_data используя DUMP оператор, как показано ниже.

grunt> Dump filter_data;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения filter_data следующим образом.

(6,Archana,Mishra,23,9848022335,Chennai)
(8,Bharathi,Nambiayar,24,9848022333,Chennai)

В DISTINCT Оператор используется для удаления избыточных (повторяющихся) кортежей из отношения.

Синтаксис

Ниже приведен синтаксис DISTINCT оператор.

grunt> Relation_name2 = DISTINCT Relatin_name1;

пример

Предположим, у нас есть файл с именем student_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata 
002,siddarth,Battacharya,9848022338,Kolkata 
003,Rajesh,Khanna,9848022339,Delhi 
003,Rajesh,Khanna,9848022339,Delhi 
004,Preethi,Agarwal,9848022330,Pune 
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai 
006,Archana,Mishra,9848022335,Chennai

И мы загрузили этот файл в Pig с именем отношения student_details как показано ниже.

grunt> student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',') 
   as (id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray);

Теперь давайте удалим избыточные (повторяющиеся) кортежи из отношения с именем student_details используя DISTINCT оператор и сохраните его как другое отношение с именем distinct_data как показано ниже.

grunt> distinct_data = DISTINCT student_details;

Проверка

Проверить связь distinct_data используя DUMP оператор, как показано ниже.

grunt> Dump distinct_data;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения distinct_data следующим образом.

(1,Rajiv,Reddy,9848022337,Hyderabad)
(2,siddarth,Battacharya,9848022338,Kolkata) 
(3,Rajesh,Khanna,9848022339,Delhi) 
(4,Preethi,Agarwal,9848022330,Pune) 
(5,Trupthi,Mohanthy,9848022336,Bhuwaneshwar)
(6,Archana,Mishra,9848022335,Chennai)

В FOREACH Оператор используется для генерации указанных преобразований данных на основе данных столбца.

Синтаксис

Ниже приведен синтаксис FOREACH оператор.

grunt> Relation_name2 = FOREACH Relatin_name1 GENERATE (required data);

пример

Предположим, у нас есть файл с именем student_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi 
004,Preethi,Agarwal,21,9848022330,Pune 
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar 
006,Archana,Mishra,23,9848022335,Chennai 
007,Komal,Nayak,24,9848022334,trivendram 
008,Bharathi,Nambiayar,24,9848022333,Chennai

И мы загрузили этот файл в Pig с именем отношения student_details как показано ниже.

grunt> student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray,age:int, phone:chararray, city:chararray);

Давайте теперь получим значения идентификатора, возраста и города каждого студента из отношения student_details и сохраните его в другом отношении с именем foreach_data используя foreach оператор, как показано ниже.

grunt> foreach_data = FOREACH student_details GENERATE id,age,city;

Проверка

Проверить связь foreach_data используя DUMP оператор, как показано ниже.

grunt> Dump foreach_data;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения foreach_data.

(1,21,Hyderabad)
(2,22,Kolkata)
(3,22,Delhi)
(4,21,Pune) 
(5,23,Bhuwaneshwar)
(6,23,Chennai) 
(7,24,trivendram)
(8,24,Chennai)

В ORDER BY Оператор используется для отображения содержимого отношения в отсортированном порядке на основе одного или нескольких полей.

Синтаксис

Ниже приведен синтаксис ORDER BY оператор.

grunt> Relation_name2 = ORDER Relatin_name1 BY (ASC|DESC);

пример

Предположим, у нас есть файл с именем student_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi 
004,Preethi,Agarwal,21,9848022330,Pune 
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar 
006,Archana,Mishra,23,9848022335,Chennai 
007,Komal,Nayak,24,9848022334,trivendram 
008,Bharathi,Nambiayar,24,9848022333,Chennai

И мы загрузили этот файл в Pig с именем отношения student_details как показано ниже.

grunt> student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray,age:int, phone:chararray, city:chararray);

Давайте теперь отсортируем отношение в порядке убывания в зависимости от возраста ученика и сохраним его в другом отношении с именем order_by_data используя ORDER BY оператор, как показано ниже.

grunt> order_by_data = ORDER student_details BY age DESC;

Проверка

Проверить связь order_by_data используя DUMP оператор, как показано ниже.

grunt> Dump order_by_data;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения order_by_data.

(8,Bharathi,Nambiayar,24,9848022333,Chennai)
(7,Komal,Nayak,24,9848022334,trivendram)
(6,Archana,Mishra,23,9848022335,Chennai) 
(5,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar)
(3,Rajesh,Khanna,22,9848022339,Delhi) 
(2,siddarth,Battacharya,22,9848022338,Kolkata)
(4,Preethi,Agarwal,21,9848022330,Pune) 
(1,Rajiv,Reddy,21,9848022337,Hyderabad)

В LIMIT Оператор используется для получения ограниченного количества кортежей из отношения.

Синтаксис

Ниже приведен синтаксис LIMIT оператор.

grunt> Result = LIMIT Relation_name required number of tuples;

пример

Предположим, у нас есть файл с именем student_details.txt в каталоге HDFS /pig_data/ как показано ниже.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi 
004,Preethi,Agarwal,21,9848022330,Pune 
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar 
006,Archana,Mishra,23,9848022335,Chennai 
007,Komal,Nayak,24,9848022334,trivendram 
008,Bharathi,Nambiayar,24,9848022333,Chennai

И мы загрузили этот файл в Pig с именем отношения student_details как показано ниже.

grunt> student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray,age:int, phone:chararray, city:chararray);

Теперь давайте отсортируем отношение в порядке убывания в зависимости от возраста ученика и сохраним его в другом отношении с именем limit_data используя ORDER BY оператор, как показано ниже.

grunt> limit_data = LIMIT student_details 4;

Проверка

Проверить связь limit_data используя DUMP оператор, как показано ниже.

grunt> Dump limit_data;

Вывод

Он выдаст следующий результат, отображающий содержимое отношения limit_data следующим образом.

(1,Rajiv,Reddy,21,9848022337,Hyderabad) 
(2,siddarth,Battacharya,22,9848022338,Kolkata) 
(3,Rajesh,Khanna,22,9848022339,Delhi) 
(4,Preethi,Agarwal,21,9848022330,Pune)

Apache Pig предоставляет различные встроенные функции, а именно: eval, load, store, math, string, bag и tuple функции.

Оценочные функции

Ниже приводится список eval функции, предоставляемые Apache Pig.

SN Описание функции
1 AVG ()

Для вычисления среднего числовых значений в сумке.

2 BagToString ()

Чтобы объединить элементы сумки в строку. При объединении мы можем поставить разделитель между этими значениями (необязательно).

3 CONCAT ()

Для объединения двух или более выражений одного типа.

4 COUNT ()

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

5 COUNT_STAR ()

Это похоже на COUNT()функция. Используется для определения количества элементов в сумке.

6 DIFF ()

Сравнить две сумки (поля) в кортеже.

7 Пусто()

Проверить, пуста ли сумка или карта.

8 МАКСИМУМ()

Чтобы вычислить максимальное значение для столбца (числовые значения или символы) в пакете с одним столбцом.

9 МИН ()

Чтобы получить минимальное (самое низкое) значение (числовое или chararray) для определенного столбца в пакете с одним столбцом.

10 PluckTuple ()

Использование латыни свиньи PluckTuple() функции, мы можем определить строковый префикс и отфильтровать столбцы в отношении, которые начинаются с данного префикса.

11 РАЗМЕР()

Для вычисления количества элементов на основе любого типа данных Pig.

12 ВЫЧИСЛЕНИЕ ()

Вычесть два мешка. Он принимает два пакета в качестве входных данных и возвращает пакет, который содержит кортежи первого пакета, которых нет во втором пакете.

13 СУММ ()

Чтобы получить сумму числовых значений столбца в пакете с одним столбцом.

14 ТОКЕНИЗАЦИЯ ()

Чтобы разделить строку (которая содержит группу слов) на один кортеж и вернуть пакет, содержащий результат операции разделения.

В Load и StoreФункции в Apache Pig используются для определения того, как данные поступают из Pig. Эти функции используются с операторами загрузки и сохранения. Ниже приведен список функций загрузки и сохранения, доступных в Pig.

SN Описание функции
1 PigStorage ()

Для загрузки и хранения структурированных файлов.

2 TextLoader ()

Чтобы загрузить неструктурированные данные в Pig.

3 BinStorage ()

Для загрузки и хранения данных в Pig в машиночитаемом формате.

4 Обработка сжатия

В Pig Latin мы можем загружать и хранить сжатые данные.

Ниже приведен список функций Bag и Tuple.

SN Описание функции
1 ТОБАГ ()

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

2 ТОП()

Чтобы получить верх N кортежи отношения.

3 ВСЕГО ()

Чтобы преобразовать одно или несколько выражений в кортеж.

4 НА КАРТУ()

Чтобы преобразовать пары "ключ-значение" в Map.

В Apache Pig есть следующие строковые функции.

SN Функции и описание
1 КОНЕЦ (строка; testAgainst)

Чтобы проверить, заканчивается ли данная строка определенной подстрокой.

2 НАЧИНАЕТСЯ (строка; подстрока)

Принимает два строковых параметра и проверяет, начинается ли первая строка со второй.

3 ПОДСТРОКА (строка, startIndex, stopIndex)

Возвращает подстроку из заданной строки.

4 EqualsIgnoreCase (строка1, строка2)

Сравнить два жалобы без учета регистра.

5 ИНДЕКСОФ (строка; 'символ'; начальный индекс)

Возвращает первое вхождение символа в строку с поиском вперед от начального индекса.

6 LAST_INDEX_OF (выражение)

Возвращает индекс последнего вхождения символа в строке с поиском в обратном направлении от начального индекса.

7 LCFIRST (выражение)

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

8 UCFIRST (выражение)

Возвращает строку с первым символом, преобразованным в верхний регистр.

9 UPPER (выражение)

UPPER (выражение) Возвращает строку, преобразованную в верхний регистр.

10 НИЖНИЙ (выражение)

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

11 ЗАМЕНИТЬ (строка, 'oldChar', 'newChar');

Чтобы заменить существующие символы в строке новыми символами.

12 СТРОПЛИТ (строка; регулярное выражение; предел)

Чтобы разбить строку вокруг совпадений с заданным регулярным выражением.

13 STRSPLITTOBAG (строка; регулярное выражение; ограничение)

Подобно STRSPLIT() функция, она разбивает строку по заданному разделителю и возвращает результат в сумке.

14 TRIM (выражение)

Возвращает копию строки с удаленными начальными и конечными пробелами.

15 LTRIM (выражение)

Возвращает копию строки с удаленными ведущими пробелами.

16 RTRIM (выражение)

Возвращает копию строки с удаленными конечными пробелами.

Apache Pig предоставляет следующие функции даты и времени -

SN Функции и описание
1 ToDate (миллисекунды)

Эта функция возвращает объект даты и времени в соответствии с заданными параметрами. Другой альтернативой этой функции являются ToDate (iosstring), ToDate (строка пользователя, формат), ToDate (строка пользователя, формат, часовой пояс).

2 Текущее время()

возвращает объект даты и времени текущего времени.

3 GetDay (дата и время)

Возвращает день месяца из объекта даты и времени.

4 GetHour (дата и время)

Возвращает час дня из объекта даты и времени.

5 GetMilliSecond (дата и время)

Возвращает миллисекунду секунды из объекта даты и времени.

6 GetMinute (дата и время)

Возвращает минуту часа из объекта даты и времени.

7 GetMonth (дата и время)

Возвращает месяц года из объекта даты и времени.

8 GetSecond (дата и время)

Возвращает секунды минуты из объекта даты и времени.

9 GetWeek (дата и время)

Возвращает неделю года из объекта даты и времени.

10 GetWeekYear (дата и время)

Возвращает год недели из объекта даты и времени.

11 GetYear (дата и время)

Возвращает год из объекта даты и времени.

12 AddDuration (дата, время, продолжительность)

Возвращает результат объекта даты и времени вместе с объектом продолжительности.

13 SubtractDuration (дата, время, продолжительность)

Вычитает объект Duration из объекта Date-Time и возвращает результат.

14 DaysBetween (datetime1, datetime2)

Возвращает количество дней между двумя объектами даты и времени.

15 HoursBetween (datetime1, datetime2)

Возвращает количество часов между двумя объектами даты и времени.

16 MilliSecondsBetween (datetime1, datetime2)

Возвращает количество миллисекунд между двумя объектами даты и времени.

17 Минуты между (datetime1, datetime2)

Возвращает количество минут между двумя объектами даты и времени.

18 MonthsBetween (datetime1, datetime2)

Возвращает количество месяцев между двумя объектами даты и времени.

19 SecondsBetween (datetime1, datetime2)

Возвращает количество секунд между двумя объектами даты и времени.

20 WeeksBetween (datetime1, datetime2)

Возвращает количество недель между двумя объектами даты и времени.

21 год YearsBetween (datetime1, datetime2)

Возвращает количество лет между двумя объектами даты и времени.

В Apache Pig есть следующие математические функции:

SN Функции и описание
1 ABS (выражение)

Чтобы получить абсолютное значение выражения.

2 ACOS (выражение)

Чтобы получить арккосинус выражения.

3 ASIN (выражение)

Чтобы получить арксинус выражения.

4 ATAN (выражение)

Эта функция используется для получения арктангенса выражения.

5 CBRT (выражение)

Эта функция используется для получения кубического корня выражения.

6 CEIL (выражение)

Эта функция используется для округления значения выражения до ближайшего целого числа.

7 COS (выражение)

Эта функция используется для получения тригонометрического косинуса выражения.

8 COSH (выражение)

Эта функция используется для получения гиперболического косинуса выражения.

9 EXP (выражение)

Эта функция используется для возведения числа Эйлера e в степень x.

10 ПОЛ (выражение)

Чтобы округлить значение выражения до ближайшего целого числа.

11 LOG (выражение)

Чтобы получить натуральный логарифм (основание e) выражения.

12 LOG10 (выражение)

Чтобы получить десятичный логарифм выражения.

13 СЛУЧАЙНЫЙ ()

Чтобы получить псевдослучайное число (введите double), большее или равное 0,0 и меньшее 1,0.

14 КРУГЛЫЙ (выражение)

Чтобы округлить значение выражения до целого числа (если тип результата - float) или округлить до длинного (если тип результата - double).

15 SIN (выражение)

Чтобы получить синус выражения.

16 SINH (выражение)

Чтобы получить гиперболический синус выражения.

17 SQRT (выражение)

Чтобы получить положительный квадратный корень из выражения.

18 TAN (выражение)

Чтобы получить тригонометрический тангенс угла.

19 TANH (выражение)

Чтобы получить гиперболический тангенс выражения.

Помимо встроенных функций, Apache Pig предоставляет обширную поддержку для Uсер Dопределен Fобъединения (UDF). Используя эти UDF, мы можем определять наши собственные функции и использовать их. Поддержка UDF предоставляется на шести языках программирования, а именно Java, Jython, Python, JavaScript, Ruby и Groovy.

Для написания UDF полная поддержка предоставляется на Java, а ограниченная поддержка предоставляется на всех остальных языках. Используя Java, вы можете писать UDF, включающие все части обработки, такие как загрузка / сохранение данных, преобразование столбцов и агрегирование. Поскольку Apache Pig был написан на Java, UDF, написанные с использованием языка Java, работают более эффективно по сравнению с другими языками.

В Apache Pig у нас также есть репозиторий Java для UDF с именем Piggybank. Используя Piggybank, мы можем получить доступ к Java UDF, написанному другими пользователями, и добавить наши собственные UDF.

Типы UDF в Java

При написании UDF с использованием Java мы можем создавать и использовать следующие три типа функций:

  • Filter Functions- Функции фильтра используются как условия в операторах фильтра. Эти функции принимают на вход значение Pig и возвращают логическое значение.

  • Eval Functions- Функции Eval используются в операторах FOREACH-GENERATE. Эти функции принимают значение Pig в качестве входных данных и возвращают результат Pig.

  • Algebraic Functions- Алгебраические функции действуют на внутренние пакеты в операторе FOREACHGENERATE. Эти функции используются для выполнения полных операций MapReduce с внутренним пакетом.

Написание UDF с использованием Java

Чтобы написать UDF с использованием Java, мы должны интегрировать файл jar Pig-0.15.0.jar. В этом разделе мы обсудим, как написать образец UDF с помощью Eclipse. Прежде чем продолжить, убедитесь, что в вашей системе установлены Eclipse и Maven.

Следуйте инструкциям ниже, чтобы написать функцию UDF -

  • Откройте Eclipse и создайте новый проект (скажем myproject).

  • Преобразуйте вновь созданный проект в проект Maven.

  • Скопируйте следующий контент в pom.xml. Этот файл содержит зависимости Maven для файлов jar Apache Pig и Hadoop-core.

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0http://maven.apache .org/xsd/maven-4.0.0.xsd"> 
	
   <modelVersion>4.0.0</modelVersion> 
   <groupId>Pig_Udf</groupId> 
   <artifactId>Pig_Udf</artifactId> 
   <version>0.0.1-SNAPSHOT</version>
	
   <build>    
      <sourceDirectory>src</sourceDirectory>    
      <plugins>      
         <plugin>        
            <artifactId>maven-compiler-plugin</artifactId>        
            <version>3.3</version>        
            <configuration>          
               <source>1.7</source>          
               <target>1.7</target>        
            </configuration>      
         </plugin>    
      </plugins>  
   </build>
	
   <dependencies> 
	
      <dependency>            
         <groupId>org.apache.pig</groupId>            
         <artifactId>pig</artifactId>            
         <version>0.15.0</version>     
      </dependency> 
		
      <dependency>        
         <groupId>org.apache.hadoop</groupId>            
         <artifactId>hadoop-core</artifactId>            
         <version>0.20.2</version>     
      </dependency> 
      
   </dependencies>  
	
</project>
  • Сохраните файл и обновите его. вMaven Dependencies раздел, вы можете найти загруженные файлы jar.

  • Создайте новый файл класса с именем Sample_Eval и скопируйте в него следующий контент.

import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 
 
import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple;

public class Sample_Eval extends EvalFunc<String>{ 

   public String exec(Tuple input) throws IOException {   
      if (input == null || input.size() == 0)      
      return null;      
      String str = (String)input.get(0);      
      return str.toUpperCase();  
   } 
}

При написании UDF обязательно унаследовать класс EvalFunc и предоставить реализацию для exec()функция. В этой функции написан код, необходимый для UDF. В приведенном выше примере мы вернули код для преобразования содержимого данного столбца в верхний регистр.

  • После компиляции класса без ошибок щелкните правой кнопкой мыши файл Sample_Eval.java. Это дает вам меню. Выбратьexport как показано на следующем снимке экрана.

  • При нажатии export, вы получите следующее окно. Нажмите наJAR file.

  • Продолжите, нажав Next>кнопка. Вы получите еще одно окно, в котором вам нужно ввести путь в локальной файловой системе, где вам нужно сохранить файл jar.

  • Наконец нажмите кнопку Finishкнопка. В указанной папке файл Jarsample_udf.jarсоздано. Этот файл jar содержит UDF, написанный на Java.

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

После написания UDF и создания файла Jar выполните следующие действия:

Шаг 1: Регистрация файла Jar

После написания UDF (на Java) мы должны зарегистрировать файл Jar, содержащий UDF, с помощью оператора Register. Регистрируя Jar-файл, пользователи могут сообщить Apache Pig расположение UDF.

Syntax

Ниже приводится синтаксис оператора Register.

REGISTER path;

Example

В качестве примера давайте зарегистрируем файл sample_udf.jar, созданный ранее в этой главе.

Запустите Apache Pig в локальном режиме и зарегистрируйте файл jar sample_udf.jar, как показано ниже.

$cd PIG_HOME/bin $./pig –x local 

REGISTER '/$PIG_HOME/sample_udf.jar'

Note - предположим, что файл Jar находится по пути - /$PIG_HOME/sample_udf.jar

Шаг 2: определение псевдонима

После регистрации UDF мы можем определить псевдоним для него, используя Define оператор.

Syntax

Ниже приведен синтаксис оператора Define.

DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };

Example

Определите псевдоним для sample_eval, как показано ниже.

DEFINE sample_eval sample_eval();

Шаг 3: Использование UDF

После определения псевдонима вы можете использовать UDF так же, как встроенные функции. Предположим, есть файл с именем emp_data в HDFS/Pig_Data/ каталог со следующим содержанием.

001,Robin,22,newyork
002,BOB,23,Kolkata
003,Maya,23,Tokyo
004,Sara,25,London 
005,David,23,Bhuwaneshwar 
006,Maggy,22,Chennai
007,Robert,22,newyork
008,Syam,23,Kolkata
009,Mary,25,Tokyo
010,Saran,25,London 
011,Stacy,25,Bhuwaneshwar 
012,Kelly,22,Chennai

Предположим, мы загрузили этот файл в Pig, как показано ниже.

grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, city:chararray);

Давайте теперь преобразуем имена сотрудников в верхний регистр с помощью UDF sample_eval.

grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);

Проверить содержимое отношения Upper_case как показано ниже.

grunt> Dump Upper_case;
  
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)

В этой главе мы увидим, как запускать сценарии Apache Pig в пакетном режиме.

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

При написании сценария в файле мы можем включать в него комментарии, как показано ниже.

Многострочные комментарии

Мы будем начинать многострочные комментарии с '/ *', заканчивая их '* /'.

/* These are the multi-line comments 
  In the pig script */

Однострочные комментарии

Мы начнем однострочные комментарии с "-".

--we can write single line comments like this.

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

Выполняя операторы Apache Pig в пакетном режиме, выполните действия, указанные ниже.

Шаг 1

Запишите все необходимые операторы Pig Latin в один файл. Мы можем записать все операторы и команды Pig Latin в один файл и сохранить его как.pig файл.

Шаг 2

Выполните сценарий Apache Pig. Вы можете выполнить сценарий Pig из оболочки (Linux), как показано ниже.

Локальный режим Режим MapReduce
$ pig -x местный Sample_script.pig $ pig -x mapreduce Sample_script.pig

Вы также можете выполнить его из оболочки Grunt, используя команду exec, как показано ниже.

grunt> exec /sample_script.pig

Выполнение скрипта Pig из HDFS

Мы также можем выполнить сценарий Pig, который находится в HDFS. Предположим, есть скрипт Pig с названиемSample_script.pig в каталоге HDFS с именем /pig_data/. Мы можем выполнить это, как показано ниже.

$ pig -x mapreduce hdfs://localhost:9000/pig_data/Sample_script.pig

пример

Предположим, у нас есть файл student_details.txt в HDFS со следующим содержимым.

student_details.txt

001,Rajiv,Reddy,21,9848022337,Hyderabad 
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi 
004,Preethi,Agarwal,21,9848022330,Pune 
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar 
006,Archana,Mishra,23,9848022335,Chennai 
007,Komal,Nayak,24,9848022334,trivendram 
008,Bharathi,Nambiayar,24,9848022333,Chennai

У нас также есть образец скрипта с названием sample_script.pigв том же каталоге HDFS. Этот файл содержит операторы, выполняющие операции и преобразования наstudent отношение, как показано ниже.

student = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
   as (id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray);
	
student_order = ORDER student BY age DESC;
  
student_limit = LIMIT student_order 4;
  
Dump student_limit;
  • Первый оператор скрипта загрузит данные в файл с именем student_details.txt как отношение, названное student.

  • Второй оператор сценария упорядочит кортежи отношения в порядке убывания в зависимости от возраста и сохранит их как student_order.

  • Третья инструкция скрипта сохранит первые 4 кортежа student_order в виде student_limit.

  • Наконец, четвертый оператор сбросит содержимое отношения student_limit.

Давайте теперь выполним sample_script.pig как показано ниже.

$./pig -x mapreduce hdfs://localhost:9000/pig_data/sample_script.pig

Apache Pig запускается и выдает результат со следующим содержимым.

(7,Komal,Nayak,24,9848022334,trivendram)
(8,Bharathi,Nambiayar,24,9848022333,Chennai) 
(5,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar) 
(6,Archana,Mishra,23,9848022335,Chennai)
2015-10-19 10:31:27,446 [main] INFO  org.apache.pig.Main - Pig script completed in 12
minutes, 32 seconds and 751 milliseconds (752751 ms)