Apache Pig - Szybki przewodnik

Co to jest Apache Pig?

Apache Pig to abstrakcja w stosunku do MapReduce. Jest to narzędzie / platforma, która służy do analizy większych zbiorów danych reprezentujących je jako przepływy danych. Pig jest zwykle używany zHadoop; możemy wykonać wszystkie operacje manipulacji danymi w Hadoop za pomocą Apache Pig.

Do pisania programów do analizy danych Pig udostępnia język wysokiego poziomu znany jako Pig Latin. Ten język zapewnia różnym operatorom, za pomocą których programiści mogą opracowywać własne funkcje odczytu, zapisu i przetwarzania danych.

Aby analizować dane za pomocą Apache Pig, programiści muszą pisać skrypty w języku Pig Latin. Wszystkie te skrypty są wewnętrznie konwertowane na zadania mapowania i redukcji. Apache Pig ma składnik znany jakoPig Engine który akceptuje skrypty Pig Latin jako dane wejściowe i konwertuje te skrypty na zadania MapReduce.

Dlaczego potrzebujemy Apache Pig?

Programiści, którzy nie są zbyt dobrzy w Javie, zwykle mieli problemy z pracą z Hadoop, szczególnie podczas wykonywania jakichkolwiek zadań MapReduce. Apache Pig to dobrodziejstwo dla wszystkich takich programistów.

  • Za pomocą Pig Latin, programiści mogą łatwo wykonywać zadania MapReduce bez konieczności wpisywania skomplikowanych kodów w Javie.

  • Apache Pig używa multi-query approach, zmniejszając w ten sposób długość kodów. Na przykład operację, która wymagałaby wpisania 200 linii kodu (LoC) w Javie, można łatwo wykonać, wpisując zaledwie 10 LoC w Apache Pig. Ostatecznie Apache Pig skraca czas rozwoju prawie 16 razy.

  • Pig Latin jest SQL-like language i łatwo jest nauczyć się Apache Pig, gdy jesteś zaznajomiony z SQL.

  • Apache Pig zapewnia wiele wbudowanych operatorów do obsługi operacji na danych, takich jak łączenie, filtry, porządkowanie itp. Ponadto zapewnia również zagnieżdżone typy danych, takie jak krotki, worki i mapy, których brakuje w MapReduce.

Funkcje Pig

Apache Pig ma następujące funkcje -

  • Rich set of operators - Zapewnia wielu operatorom wykonywanie operacji, takich jak łączenie, sortowanie, filtrowanie itp.

  • Ease of programming - Pig Latin jest podobna do SQL i łatwo jest napisać skrypt Pig, jeśli jesteś dobry w SQL.

  • Optimization opportunities - Zadania w Apache Pig automatycznie optymalizują ich wykonanie, więc programiści muszą skupić się tylko na semantyce języka.

  • Extensibility - Korzystając z istniejących operatorów, użytkownicy mogą opracowywać własne funkcje odczytu, przetwarzania i zapisu danych.

  • UDF’s - Pig zapewnia możliwość tworzenia User-defined Functions w innych językach programowania, takich jak Java, i wywołuj je lub osadzaj w skryptach Pig.

  • Handles all kinds of data- Apache Pig analizuje wszelkiego rodzaju dane, zarówno ustrukturyzowane, jak i nieustrukturyzowane. Przechowuje wyniki w HDFS.

Apache Pig Vs MapReduce

Poniżej wymienione są główne różnice między Apache Pig i MapReduce.

Apache Pig MapReduce
Apache Pig to język przepływu danych. MapReduce to paradygmat przetwarzania danych.
Jest to język wysokiego poziomu. MapReduce jest niskopoziomowe i sztywne.
Wykonanie operacji Join w Apache Pig jest dość proste. Wykonywanie operacji łączenia między zestawami danych w MapReduce jest dość trudne.
Każdy początkujący programista z podstawową znajomością języka SQL może wygodnie pracować z Apache Pig. Ekspozycja na Javę musi działać z MapReduce.
Apache Pig wykorzystuje podejście z wieloma zapytaniami, co znacznie zmniejsza długość kodów. MapReduce będzie wymagało prawie 20 razy większej liczby linii do wykonania tego samego zadania.
Nie ma potrzeby kompilacji. Podczas wykonywania każdy operator Apache Pig jest wewnętrznie konwertowany na zadanie MapReduce. Zadania MapReduce mają długi proces kompilacji.

Apache Pig Vs SQL

Poniżej wymienione są główne różnice między Apache Pig i SQL.

Świnia SQL
Pig Latin to procedural język. SQL to plik declarative język.
W Apache Pig, schemajest opcjonalne. Możemy przechowywać dane bez projektowania schematu (wartości są przechowywane jako pliki$01, $02 itp.) Schemat jest obowiązkowy w SQL.
Model danych w Apache Pig to nested relational. Model danych używany w SQL is flat relational.
Apache Pig zapewnia ograniczone możliwości dla Query optimization. W SQL jest więcej możliwości optymalizacji zapytań.

Oprócz powyższych różnic, Apache Pig Latin -

  • Umożliwia podziały w rurociągu.
  • Umożliwia programistom przechowywanie danych w dowolnym miejscu potoku.
  • Deklaruje plany wykonania.
  • Zapewnia operatory do wykonywania funkcji ETL (wyodrębnianie, przekształcanie i ładowanie).

Apache Pig Vs Hive

Zarówno Apache Pig, jak i Hive są używane do tworzenia zadań MapReduce. W niektórych przypadkach Hive działa na HDFS w podobny sposób, jak robi to Apache Pig. W poniższej tabeli wymieniliśmy kilka istotnych punktów, które odróżniają Apache Pig od Hive.

Apache Pig Ul
Apache Pig używa języka o nazwie Pig Latin. Został pierwotnie utworzony o godzYahoo. Hive używa języka o nazwie HiveQL. Został pierwotnie utworzony o godzFacebook.
Pig Latin to język przepływu danych. HiveQL to język przetwarzania zapytań.
Pig Latin jest językiem proceduralnym i pasuje do paradygmatu potoku. HiveQL to język deklaratywny.
Apache Pig może obsługiwać dane strukturalne, nieustrukturyzowane i częściowo ustrukturyzowane. Hive jest przeznaczony głównie dla danych strukturalnych.

Zastosowania Apache Pig

Apache Pig jest powszechnie używany przez analityków danych do wykonywania zadań obejmujących przetwarzanie ad-hoc i szybkie tworzenie prototypów. Używana jest świnia Apache -

  • Do przetwarzania ogromnych źródeł danych, takich jak dzienniki internetowe.
  • Przetwarzanie danych dla platform wyszukiwania.
  • Przetwarzanie ładunków wrażliwych na czas.

Apache Pig - Historia

W 2006Apache Pig został opracowany jako projekt badawczy w Yahoo, zwłaszcza w celu tworzenia i wykonywania zadań MapReduce na każdym zbiorze danych. W2007Apache Pig pochodzi z otwartego źródła za pośrednictwem inkubatora Apache. W2008, ukazało się pierwsze wydanie Apache Pig. W2010, Apache Pig ukończył jako projekt najwyższego poziomu Apache.

Język używany do analizy danych w Hadoop przy użyciu Pig jest znany jako Pig Latin. Jest to język przetwarzania danych wysokiego poziomu, który zapewnia bogaty zestaw typów danych i operatorów do wykonywania różnych operacji na danych.

Aby wykonać określone zadanie programiści używający Pig, programiści muszą napisać skrypt Pig w języku Pig Latin i wykonać je przy użyciu dowolnego mechanizmu wykonywania (Grunt Shell, UDFs, Embedded). Po wykonaniu te skrypty przejdą przez serię przekształceń zastosowanych przez Pig Framework, aby wygenerować żądane dane wyjściowe.

Wewnętrznie Apache Pig konwertuje te skrypty na serię zadań MapReduce, a tym samym ułatwia pracę programisty. Architekturę Apache Pig pokazano poniżej.

Komponenty Apache Pig

Jak pokazano na rysunku, w strukturze Apache Pig znajdują się różne komponenty. Przyjrzyjmy się głównym komponentom.

Parser

Początkowo Skrypty Pig są obsługiwane przez Parser. Sprawdza składnię skryptu, sprawdza typy i inne różne sprawdzenia. Wyjściem parsera będzie DAG (skierowany graf acykliczny), który reprezentuje instrukcje i operatory logiczne Pig Latin.

W DAG operatory logiczne skryptu są reprezentowane jako węzły, a przepływy danych są reprezentowane jako krawędzie.

Optimizer

Plan logiczny (DAG) jest przekazywany do optymalizatora logicznego, który przeprowadza logiczne optymalizacje, takie jak projekcja i wypychanie.

Kompilator

Kompilator kompiluje zoptymalizowany plan logiczny w serię zadań MapReduce.

Silnik wykonawczy

Na koniec zadania MapReduce są przesyłane do Hadoop w posortowanej kolejności. Na koniec te zadania MapReduce są wykonywane na platformie Hadoop, dając pożądane wyniki.

Model danych Pig Latin

Model danych Pig Latin jest w pełni zagnieżdżony i zezwala na złożone nieatomowe typy danych, takie jak map i tuple. Poniżej podano schematyczne przedstawienie modelu danych Pig Latin.

Atom

Każda pojedyncza wartość w Pig Latin, niezależnie od ich danych, jest znana jako Atom. Jest przechowywany jako ciąg i może być używany jako ciąg i liczba. int, long, float, double, chararray i bytearray to atomowe wartości Pig. Fragment danych lub prosta wartość atomowa jest znana jakofield.

Example - „raja” lub „30”

Tuple

Rekord utworzony przez uporządkowany zestaw pól jest nazywany krotką, a pola mogą być dowolnego typu. Krotka jest podobna do wiersza w tabeli RDBMS.

Example - (Raja, 30 lat)

Torba

Torba to nieuporządkowany zestaw krotek. Innymi słowy, zbiór krotek (nieunikatowy) jest nazywany workiem. Każda krotka może mieć dowolną liczbę pól (elastyczny schemat). Worek jest reprezentowany przez „{}”. Jest podobny do tabeli w RDBMS, ale w przeciwieństwie do tabeli w RDBMS, nie jest konieczne, aby każda krotka zawierała taką samą liczbę pól lub aby pola na tej samej pozycji (kolumnie) miały ten sam typ.

Example - {(Raja, 30), (Mohammad, 45)}

Torba może być polem w relacji; w tym kontekście jest znany jakoinner bag.

Example- {Raja, 30, {9848022338, [email protected],} }

Mapa

Mapa (lub mapa danych) to zestaw par klucz-wartość. Plikkeymusi być typu chararray i powinno być niepowtarzalne. Plikvaluemoże być dowolnego typu. Jest reprezentowany przez „[]”

Example - [imię # Raja, wiek # 30]

Relacja

Relacja to zbiór krotek. Relacje w Pig Latin są nieuporządkowane (nie ma gwarancji, że krotki są przetwarzane w określonej kolejności).

W tym rozdziale wyjaśniono, jak pobrać, zainstalować i skonfigurować Apache Pig w twoim systemie.

Wymagania wstępne

Przed przejściem do Apache Pig ważne jest, aby mieć zainstalowane oprogramowanie Hadoop i Java w systemie. Dlatego przed zainstalowaniem Apache Pig zainstaluj Hadoop i Javę, wykonując czynności podane w poniższym łączu -

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

Pobierz Apache Pig

Przede wszystkim pobierz najnowszą wersję Apache Pig z następującej strony internetowej - https://pig.apache.org/

Krok 1

Otwórz stronę główną witryny Apache Pig. W sekcjiNews, Kliknij w link release page jak pokazano na poniższej migawce.

Krok 2

Po kliknięciu określonego linku zostaniesz przekierowany do Apache Pig Releasesstrona. Na tej stronie podDownload będziesz mieć dwa linki, a mianowicie, Pig 0.8 and later i Pig 0.7 and before. Kliknij w linkPig 0.8 and later, zostaniesz przekierowany do strony zawierającej zestaw serwerów lustrzanych.

Krok 3

Wybierz i kliknij dowolne z tych lusterek, jak pokazano poniżej.

Krok 4

Te lustra zabiorą Cię do Pig Releasesstrona. Ta strona zawiera różne wersje Apache Pig. Kliknij najnowszą wersję spośród nich.

Krok 5

W tych folderach będziesz mieć pliki źródłowe i binarne Apache Pig w różnych dystrybucjach. Pobierz pliki tar z plików źródłowych i binarnych Apache Pig 0.15,pig0.15.0-src.tar.gz i pig-0.15.0.tar.gz.

Zainstaluj Apache Pig

Po pobraniu oprogramowania Apache Pig zainstaluj je w środowisku Linux, wykonując czynności podane poniżej.

Krok 1

Utwórz katalog o nazwie Pig w tym samym katalogu, w którym znajdują się katalogi instalacyjne Hadoop, Java,i inne oprogramowanie zostało zainstalowane. (W naszym samouczku utworzyliśmy katalog Pig w użytkowniku o nazwie Hadoop).

$ mkdir Pig

Krok 2

Rozpakuj pobrane pliki tar, jak pokazano poniżej.

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

Krok 3

Przenieś zawartość pig-0.15.0-src.tar.gz plik do Pig katalog utworzony wcześniej, jak pokazano poniżej.

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

Skonfiguruj Apache Pig

Po zainstalowaniu Apache Pig musimy go skonfigurować. Aby skonfigurować, musimy edytować dwa pliki -bashrc and pig.properties.

plik .bashrc

w .bashrc plik, ustaw następujące zmienne -

  • PIG_HOME folder do folderu instalacyjnego Apache Pig,

  • PATH zmienną środowiskową do folderu bin i

  • PIG_CLASSPATH zmienną środowiskową do folderu etc (configuration) instalacji Hadoop (katalogu zawierającego pliki core-site.xml, hdfs-site.xml i mapred-site.xml).

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

plik pig.properties

w conf folder Pig, mamy plik o nazwie pig.properties. W pliku pig.properties można ustawić różne parametry, jak podano poniżej.

pig -h properties

Obsługiwane są następujące właściwości -

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.

Weryfikacja instalacji

Sprawdź instalację Apache Pig, wpisując polecenie version. Jeśli instalacja się powiedzie, otrzymasz wersję Apache Pig, jak pokazano poniżej.

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

W poprzednim rozdziale wyjaśniliśmy, jak zainstalować Apache Pig. W tym rozdziale omówimy, jak uruchomić Apache Pig.

Tryby wykonywania Apache Pig

Możesz uruchomić Apache Pig w dwóch trybach, a mianowicie: Local Mode i HDFS mode.

Tryb lokalny

W tym trybie wszystkie pliki są instalowane i uruchamiane z lokalnego hosta i lokalnego systemu plików. Nie ma potrzeby korzystania z Hadoop ani HDFS. Ten tryb jest zwykle używany do celów testowych.

Tryb MapReduce

W trybie MapReduce ładujemy lub przetwarzamy dane istniejące w systemie plików Hadoop (HDFS) przy użyciu Apache Pig. W tym trybie za każdym razem, gdy wykonujemy instrukcje Pig Latin w celu przetworzenia danych, na zapleczu wywoływane jest zadanie MapReduce w celu wykonania określonej operacji na danych istniejących w HDFS.

Mechanizmy wykonywania Apache Pig

Skrypty Apache Pig można wykonywać na trzy sposoby, mianowicie w trybie interaktywnym, trybie wsadowym i trybie osadzonym.

  • Interactive Mode(Powłoka Grunt) - Możesz uruchomić Apache Pig w trybie interaktywnym za pomocą powłoki Grunt. W tej powłoce możesz wprowadzić instrukcje Pig Latin i uzyskać dane wyjściowe (za pomocą operatora Dump).

  • Batch Mode (Skrypt) - Możesz uruchomić Apache Pig w trybie wsadowym, pisząc skrypt Pig Latin w jednym pliku z rozszerzeniem .pig rozbudowa.

  • Embedded Mode (UDF) - Apache Pig zapewnia możliwość definiowania własnych funkcji (User Defined Functions) w językach programowania, takich jak Java, i używanie ich w naszym skrypcie.

Wywołanie powłoki Grunt

Możesz wywołać powłokę Grunt w żądanym trybie (lokalny / MapReduce) za pomocą −x opcja, jak pokazano poniżej.

Tryb lokalny Tryb MapReduce

Command −

$ ./pig –x local

Command −

$ ./pig -x mapreduce

Output -

Output -

Każde z tych poleceń powoduje wyświetlenie zachęty powłoki Grunt, jak pokazano poniżej.

grunt>

Możesz wyjść z powłoki Grunt za pomocą ‘ctrl + d’.

Po wywołaniu powłoki Grunt można wykonać skrypt Pig, wprowadzając bezpośrednio w nim instrukcje Pig Latin.

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

Wykonywanie Apache Pig w trybie wsadowym

Możesz napisać cały skrypt Pig Latin w pliku i wykonać go przy użyciu rozszerzenia –x command. Załóżmy, że mamy skrypt Pig w pliku o nazwiesample_script.pig jak pokazano niżej.

Sample_script.pig

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

Teraz możesz wykonać skrypt w powyższym pliku, jak pokazano poniżej.

Tryb lokalny Tryb MapReduce
$ pig -x local Sample_script.pig $ pig -x mapreduce Sample_script.pig

Note - Omówimy szczegółowo, jak uruchomić skrypt Pig w programie Bach mode i w embedded mode w kolejnych rozdziałach.

Po wywołaniu powłoki Grunt możesz uruchamiać w niej swoje skrypty Pig. Oprócz tego powłoka Grunt udostępnia przydatne polecenia powłoki i narzędzi. Ten rozdział wyjaśnia powłoki i polecenia narzędziowe dostarczane przez powłokę Grunt.

Note - W niektórych częściach tego rozdziału polecenia takie jak Load i Storesą używane. Zapoznaj się z odpowiednimi rozdziałami, aby uzyskać szczegółowe informacje na ich temat.

Polecenia powłoki

Powłoka Grunt Apache Pig jest używana głównie do pisania skryptów Pig Latin. Wcześniej możemy wywołać dowolne polecenia powłoki za pomocąsh i fs.

sh Command

Za pomocą shpolecenie, możemy wywołać dowolne polecenia powłoki z powłoki Grunt. Za pomocąsh polecenie z powłoki Grunt, nie możemy wykonać poleceń, które są częścią środowiska powłoki (ex - cd).

Syntax

Poniżej podano składnię sh Komenda.

grunt> sh shell command parameters

Example

Możemy wywołać ls polecenie powłoki Linux z powłoki Grunt przy użyciu rozszerzenia shopcja, jak pokazano poniżej. W tym przykładzie wyświetla listę plików w/pig/bin/ informator.

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

fs Command

Używając fs polecenie, możemy wywołać dowolne polecenia FsShell z powłoki Grunt.

Syntax

Poniżej podano składnię fs Komenda.

grunt> sh File System command parameters

Example

Możemy wywołać polecenie ls HDFS z powłoki Grunt za pomocą polecenia fs. W poniższym przykładzie zawiera listę plików w katalogu głównym 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

W ten sam sposób możemy wywołać wszystkie inne polecenia powłoki systemu plików z powłoki Grunt za pomocą rozszerzenia fs Komenda.

Polecenia narzędziowe

Powłoka Grunt udostępnia zestaw poleceń narzędziowych. Należą do nich polecenia narzędziowe, takie jakclear, help, history, quit, i set; i polecenia takie jakexec, kill, i rundo kontrolowania Pig z powłoki Grunt. Poniżej podano opis poleceń narzędziowych udostępnianych przez powłokę Grunt.

wyczyść polecenie

Plik clear polecenie służy do czyszczenia ekranu powłoki Grunt.

Syntax

Możesz wyczyścić ekran powłoki gruntów za pomocą clear polecenie, jak pokazano poniżej.

grunt> clear

help Command

Plik help polecenie wyświetla listę poleceń Pig lub właściwości Pig.

Usage

Możesz uzyskać listę poleceń Pig za pomocą help polecenie, jak pokazano poniżej.

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.

Dowództwo historii

To polecenie wyświetla listę instrukcji wykonanych / wykorzystanych do tej pory od momentu wywołania sprzedaży Grunt.

Usage

Załóżmy, że wykonaliśmy trzy instrukcje od czasu otwarcia powłoki 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(',');

Następnie za pomocą history polecenie zwróci następujące dane wyjściowe.

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 Command

Plik set polecenie służy do wyświetlania / przypisywania wartości do klawiszy używanych w Pig.

Usage

Za pomocą tego polecenia można ustawić wartości dla następujących kluczy.

Klucz Opis i wartości
default_parallel Możesz ustawić liczbę redukcji dla zadania mapy, przekazując dowolną liczbę całkowitą jako wartość do tego klucza.
debug Możesz wyłączyć lub włączyć funkcję debugowania w Pig, przekazując on / off do tego klucza.
job.name Możesz ustawić nazwę zadania na wymagane zadanie, przekazując wartość ciągu do tego klucza.
job.priority

Możesz ustawić priorytet zadania na zadanie, przekazując jedną z następujących wartości do tego klucza -

  • very_low
  • low
  • normal
  • high
  • very_high
stream.skippath W przypadku przesyłania strumieniowego można ustawić ścieżkę, z której dane nie mają być przesyłane, przekazując żądaną ścieżkę w postaci ciągu do tego klucza.

quit Command

Za pomocą tego polecenia możesz wyjść z powłoki Grunt.

Usage

Wyjdź z powłoki Grunt, jak pokazano poniżej.

grunt> quit

Przyjrzyjmy się teraz poleceniom, za pomocą których możesz sterować Apache Pig z powłoki Grunt.

exec Command

Używając exec polecenie, możemy wykonywać skrypty Pig z powłoki Grunt.

Syntax

Poniżej podano składnię polecenia narzędzia exec.

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

Example

Załóżmy, że istnieje plik o nazwie student.txt w /pig_data/ katalog HDFS z następującą zawartością.

Student.txt

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

Załóżmy, że mamy plik skryptu o nazwie sample_script.pig w /pig_data/ katalog HDFS z następującą zawartością.

Sample_script.pig

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

Teraz wykonajmy powyższy skrypt z powłoki Grunt przy użyciu rozszerzenia exec polecenie, jak pokazano poniżej.

grunt> exec /sample_script.pig

Output

Plik exec polecenie wykonuje skrypt w sample_script.pig. Zgodnie ze skryptem ładuje plikstudent.txt plik do Pig i daje wynik operatora Dump wyświetlający następującą zawartość.

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

kill Command

Możesz zabić zadanie z powłoki Grunt za pomocą tego polecenia.

Syntax

Poniżej podano składnię kill Komenda.

grunt> kill JobId

Example

Załóżmy, że jest uruchomiona praca Pig o identyfikatorze Id_0055, możesz go zabić z powłoki Grunt za pomocą kill polecenie, jak pokazano poniżej.

grunt> kill Id_0055

Uruchom polecenie

Możesz uruchomić skrypt Pig z powłoki Grunt przy użyciu run Komenda

Syntax

Poniżej podano składnię run Komenda.

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

Example

Załóżmy, że istnieje plik o nazwie student.txt w /pig_data/ katalog HDFS z następującą zawartością.

Student.txt

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

Załóżmy, że mamy plik skryptu o nazwie sample_script.pig w lokalnym systemie plików z następującą zawartością.

Sample_script.pig

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

Teraz uruchommy powyższy skrypt z powłoki Grunt za pomocą polecenia run, jak pokazano poniżej.

grunt> run /sample_script.pig

Możesz zobaczyć dane wyjściowe skryptu za pomocą Dump operator jak pokazano niżej.

grunt> Dump;

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

Note - Różnica między exec i run polecenie jest takie, że jeśli użyjemy runinstrukcje ze skryptu są dostępne w historii poleceń.

Pig Latin to język używany do analizowania danych w Hadoop przy użyciu Apache Pig. W tym rozdziale omówimy podstawy języka Pig Latin, takie jak instrukcje Pig Latin, typy danych, operatory ogólne i relacyjne oraz UDF Pig Latin.

Pig Latin - model danych

Jak omówiono w poprzednich rozdziałach, model danych Pig jest w pełni zagnieżdżony. ZARelationjest najbardziej zewnętrzną strukturą modelu danych Pig Latin. I to jestbag gdzie -

  • Torba to zbiór krotek.
  • Krotka to uporządkowany zbiór pól.
  • Pole to zbiór danych.

Pig Latin - Statemets

Podczas przetwarzania danych za pomocą Pig Latin, statements to podstawowe konstrukcje.

  • Te instrukcje działają z relations. Zawierająexpressions i schemas.

  • Każda instrukcja kończy się średnikiem (;).

  • Wykonamy różne operacje za pomocą operatorów dostarczonych przez Pig Latin, poprzez instrukcje.

  • Z wyjątkiem LOAD i STORE, podczas wykonywania wszystkich innych operacji, instrukcje Pig Latin przyjmują relację jako dane wejściowe i tworzą inną relację jako dane wyjściowe.

  • Gdy tylko wpiszesz Loadinstrukcji w powłoce Grunt, zostanie przeprowadzone sprawdzenie semantyczne. Aby zobaczyć zawartość schematu, musisz użyć rozszerzeniaDumpoperator. Dopiero po wykonaniudump operacji, zadanie MapReduce w celu załadowania danych do systemu plików zostanie wykonane.

Przykład

Poniżej podano instrukcję Pig Latin, która ładuje dane do Apache Pig.

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

Pig Latin - typy danych

W poniższej tabeli opisano typy danych Pig Latin.

SN Typ danych Opis i przykład
1 int

Reprezentuje podpisaną 32-bitową liczbę całkowitą.

Example : 8

2 długo

Reprezentuje podpisaną 64-bitową liczbę całkowitą.

Example : 5L

3 pływak

Reprezentuje podpisany 32-bitowy zmiennoprzecinkowy.

Example : 5,5 F.

4 podwójnie

Reprezentuje 64-bitowy zmiennoprzecinkowy.

Example : 10,5

5 chararray

Reprezentuje tablicę znaków (ciąg) w formacie Unicode UTF-8.

Example : 'punkt poradnika'

6 Bytearray

Reprezentuje tablicę bajtów (obiekt blob).

7 Boolean

Reprezentuje wartość logiczną.

Example : prawda fałsz.

8 Datetime

Reprezentuje datę i godzinę.

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

9 Biginteger

Reprezentuje Java BigInteger.

Example : 60708090709

10 Bigdecimal

Reprezentuje Java BigDecimal

Example : 185,98376256272893883

Złożone typy
11 Tuple

Krotka to uporządkowany zbiór pól.

Example : (raja, 30)

12 Torba

Torba to zbiór krotek.

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

13 Mapa

Mapa to zestaw par klucz-wartość.

Example : ['imię' # 'Raju', 'wiek' # 30]

Wartości zerowe

Wartości dla wszystkich powyższych typów danych mogą wynosić NULL. Apache Pig traktuje wartości null w podobny sposób jak SQL.

Wartość null może być wartością nieznaną lub nieistniejącą. Jest używany jako symbol zastępczy dla wartości opcjonalnych. Te wartości zerowe mogą wystąpić naturalnie lub mogą być wynikiem operacji.

Pig Latin - operatory arytmetyczne

W poniższej tabeli opisano operatory arytmetyczne języka Pig Latin. Załóżmy, że a = 10 i b = 20.

Operator Opis Przykład
+

Addition - Dodaje wartości po obu stronach operatora

a + b da 30
-

Subtraction - Odejmuje operand prawej ręki od operandu lewej ręki

a - b da −10
*

Multiplication - Mnoży wartości po obu stronach operatora

a * b da 200
/

Division - Dzieli operand lewej ręki przez operand prawej ręki

b / a da 2
%

Modulus - Dzieli operand po lewej stronie przez operand po prawej stronie i zwraca resztę

b% a da 0
? :

Bincond- Ocenia operatory boolowskie. Ma trzy operandy, jak pokazano poniżej.

zmienna x = (wyrażenie)? value1 jeśli prawda :value2 jeśli fałszywe .

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

jeśli a = 1, wartość b wynosi 20.

jeśli a! = 1, wartość b wynosi 30.

WALIZKA

GDY

NASTĘPNIE

ELSE END

Case - Operator przypadku jest odpowiednikiem zagnieżdżonego operatora bincond.

CASE f2% 2

KIEDY 0 TO `` równe ''

KIEDY 1 TO „nieparzyste”

KONIEC

Pig Latin - operatory porównania

W poniższej tabeli opisano operatory porównania języka Pig Latin.

Operator Opis Przykład
==

Equal- Sprawdza, czy wartości dwóch operandów są równe, czy nie; jeśli tak, to warunek staje się prawdziwy.

(a = b) nie jest prawdą
! =

Not Equal- Sprawdza, czy wartości dwóch operandów są równe, czy nie. Jeśli wartości nie są równe, warunek staje się prawdziwy.

(a! = b) jest prawdą.
>

Greater than- Sprawdza, czy wartość lewego operandu jest większa niż wartość prawego operandu. Jeśli tak, to warunek staje się prawdziwy.

(a> b) nie jest prawdą.
<

Less than- Sprawdza, czy wartość lewego operandu jest mniejsza niż wartość prawego operandu. Jeśli tak, to warunek staje się prawdziwy.

(a <b) jest prawdą.
> =

Greater than or equal to- Sprawdza, czy wartość lewego operandu jest większa lub równa wartości prawego operandu. Jeśli tak, to warunek staje się prawdziwy.

(a> = b) nie jest prawdą.
<=

Less than or equal to- Sprawdza, czy wartość lewego operandu jest mniejsza lub równa wartości prawego operandu. Jeśli tak, to warunek staje się prawdziwy.

(a <= b) jest prawdą.
mecze

Pattern matching - Sprawdza, czy łańcuch po lewej stronie pasuje do stałej po prawej stronie.

f1 pasuje do „. * tutorial. *”

Pig Latin - Type Construction Operators

W poniższej tabeli opisano operatory konstrukcji Type języka Pig Latin.

Operator Opis Przykład
()

Tuple constructor operator - Ten operator jest używany do tworzenia krotki.

(Raju, 30 lat)
{}

Bag constructor operator - Ten operator jest używany do budowy worka.

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

Map constructor operator - Ten operator jest używany do tworzenia krotki.

[imię # Raja, wiek # 30]

Pig Latin - Relational Operations

W poniższej tabeli opisano operatory relacyjne języka Pig Latin.

Operator Opis
Loading and Storing
ZAŁADUJ Aby załadować dane z systemu plików (lokalny / HDFS) do relacji.
SKLEP Aby zapisać relację do systemu plików (lokalny / HDFS).
Filtracja
FILTR Aby usunąć niechciane wiersze z relacji.
ODRĘBNY Aby usunąć zduplikowane wiersze z relacji.
FOREACH, GENERUJ Generowanie transformacji danych na podstawie kolumn danych.
STRUMIEŃ Aby przekształcić relację za pomocą zewnętrznego programu.
Grupowanie i łączenie
PRZYSTĄP Aby połączyć dwie lub więcej relacji.
COGROUP Grupowanie danych w co najmniej dwie relacje.
GRUPA Grupowanie danych w jedną relację.
KRZYŻ Tworzenie iloczynu krzyżowego dwóch lub więcej relacji.
Sortowanie
ZAMÓWIENIE Ułożenie relacji w posortowanej kolejności na podstawie jednego lub kilku pól (rosnąco lub malejąco).
LIMIT Aby uzyskać ograniczoną liczbę krotek z relacji.
Łączenie i dzielenie
UNIA Aby połączyć dwie lub więcej relacji w jedną relację.
ROZDZIELAĆ Aby podzielić pojedynczą relację na dwie lub więcej relacji.
Operatorzy diagnostyczni
WYSYPISKO Aby wydrukować zawartość relacji na konsoli.
OPISAĆ Opisać schemat relacji.
WYJAŚNIĆ Aby wyświetlić plany wykonania logiczne, fizyczne lub MapReduce w celu obliczenia relacji.
ZILUSTROWAĆ Aby wyświetlić krok po kroku wykonanie serii instrukcji.

Ogólnie rzecz biorąc, Apache Pig działa na platformie Hadoop. Jest to narzędzie analityczne, które analizuje duże zbiory danych, które istnieją wHadoop File System. Aby przeanalizować dane za pomocą Apache Pig, musimy najpierw załadować dane do Apache Pig. W tym rozdziale wyjaśniono, jak ładować dane do Apache Pig z HDFS.

Przygotowuję HDFS

W trybie MapReduce Pig odczytuje (ładuje) dane z HDFS i zapisuje wyniki z powrotem w HDFS. Dlatego uruchommy HDFS i stwórzmy następujące przykładowe dane w HDFS.

legitymacja studencka Imię Nazwisko Telefon Miasto
001 Rajiv Reddy 9848022337 Hyderabad
002 siddarth Battacharya 9848022338 Kalkuta
003 Rajesh Khanna 9848022339 Delhi
004 Preethi Agarwal 9848022330 Pune
005 Trupthi Mohanthy 9848022336 Bhuwaneshwar
006 Archana Mishra 9848022335 Chennai

Powyższy zbiór danych zawiera dane osobowe, takie jak identyfikator, imię, nazwisko, numer telefonu i miasto sześciu uczniów.

Krok 1: Weryfikacja Hadoop

Przede wszystkim sprawdź instalację za pomocą polecenia wersji Hadoop, jak pokazano poniżej.

$ hadoop version

Jeśli twój system zawiera Hadoop i jeśli ustawiłeś zmienną PATH, otrzymasz następujące dane wyjściowe -

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

Krok 2: Uruchamianie HDFS

Przejrzyj sbin katalogu Hadoop i uruchom yarn i Hadoop dfs (rozproszony system plików), jak pokazano poniżej.

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

Krok 3: Utwórz katalog w HDFS

W Hadoop DFS można tworzyć katalogi za pomocą polecenia mkdir. Utwórz nowy katalog w HDFS o nazwiePig_Data w wymaganej ścieżce, jak pokazano poniżej.

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

Krok 4: Umieszczanie danych w HDFS

Plik wejściowy Pig zawiera każdą krotkę / rekord w oddzielnych wierszach. A elementy rekordu są oddzielone separatorem (w naszym przykładzie użyliśmy“,”).

W lokalnym systemie plików utwórz plik wejściowy student_data.txt zawierające dane, jak pokazano poniżej.

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.

Teraz przenieś plik z lokalnego systemu plików do HDFS przy użyciu putpolecenie, jak pokazano poniżej. (Możesz użyćcopyFromLocal polecenie.)

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

Weryfikacja pliku

Możesz użyć cat polecenie, aby sprawdzić, czy plik został przeniesiony do HDFS, jak pokazano poniżej.

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

Wynik

Możesz zobaczyć zawartość pliku, jak pokazano poniżej.

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

Operator obciążenia

Możesz ładować dane do Apache Pig z systemu plików (HDFS / lokalny) za pomocą LOAD operator Pig Latin.

Składnia

Instrukcja load składa się z dwóch części podzielonych przez operator „=”. Po lewej stronie musimy wspomnieć o nazwie relacjiwhere chcemy przechowywać dane, a po prawej stronie musimy zdefiniować howprzechowujemy dane. Poniżej podano składnięLoad operator.

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

Gdzie,

  • relation_name - Musimy wspomnieć o relacji, w której chcemy przechowywać dane.

  • Input file path- Musimy wspomnieć o katalogu HDFS, w którym przechowywany jest plik. (W trybie MapReduce)

  • function - Musimy wybrać funkcję z zestawu funkcji ładowania dostarczonych przez Apache Pig (BinStorage, JsonLoader, PigStorage, TextLoader).

  • Schema- Musimy zdefiniować schemat danych. Możemy zdefiniować wymagany schemat w następujący sposób -

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

Note- Wczytujemy dane bez określania schematu. W takim przypadku kolumny będą adresowane jako 01 $, $ 02, itd… (czek).

Przykład

Jako przykład załadujmy dane do student_data.txt w Pig w ramach schematu o nazwie Student używając LOAD Komenda.

Uruchom Pig Grunt Shell

Przede wszystkim otwórz terminal Linux. Uruchom powłokę Pig Grunt w trybie MapReduce, jak pokazano poniżej.

$ Pig –x mapreduce

Uruchomi powłokę Pig Grunt, jak pokazano poniżej.

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>

Wykonaj instrukcję Load

Teraz załaduj dane z pliku student_data.txt do Pig, wykonując następującą instrukcję Pig Latin w powłoce 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 );

Poniżej znajduje się opis powyższego stwierdzenia.

Nazwa relacji Przechowaliśmy dane w schemacie student.
Ścieżka do pliku wejściowego Czytamy dane z pliku student_data.txt, który znajduje się w katalogu / pig_data / w HDFS.
Funkcja przechowywania Użyliśmy PigStorage()funkcjonować. Ładuje i przechowuje dane jako ustrukturyzowane pliki tekstowe. Jako parametr przyjmuje separator, za pomocą którego każda jednostka krotki jest oddzielana. Domyślnie jako parametr przyjmuje „\ t”.
schemat

Przechowaliśmy dane przy użyciu następującego schematu.

kolumna ID Imię nazwisko telefon Miasto
typ danych int tablica znaków tablica znaków tablica znaków tablica znaków

Note - The loadinstrukcja po prostu załaduje dane do określonej relacji w Pig. Aby zweryfikować wykonanieLoad musisz użyć Diagnostic Operators które są omówione w następnych rozdziałach.

W poprzednim rozdziale dowiedzieliśmy się, jak ładować dane do Apache Pig. Załadowane dane można przechowywać w systemie plików przy użyciu rozszerzeniastoreoperator. W tym rozdziale wyjaśniono, jak przechowywać dane w Apache Pig przy użyciu rozszerzeniaStore operator.

Składnia

Poniżej podano składnię wyciągu Sklepu.

STORE Relation_name INTO ' required_directory_path ' [USING function];

Przykład

Załóżmy, że mamy plik student_data.txt w formacie HDFS z następującą zawartością.

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.

Wczytaliśmy to w relację student używając operatora LOAD, jak pokazano poniżej.

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

Teraz zapiszmy relację w katalogu HDFS “/pig_Output/” jak pokazano niżej.

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

Wynik

Po wykonaniu storeotrzymasz następujący wynik. Tworzony jest katalog o określonej nazwie i dane będą w nim przechowywane.

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!

Weryfikacja

Możesz zweryfikować zapisane dane, jak pokazano poniżej.

Krok 1

Najpierw wypisz pliki w katalogu o nazwie pig_output używając ls polecenie, jak pokazano poniżej.

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

Możesz zauważyć, że po wykonaniu pliku store komunikat.

Krok 2

Za pomocą cat polecenie, wyświetla zawartość pliku o nazwie part-m-00000 jak pokazano niżej.

$ 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

Plik loadinstrukcja po prostu załaduje dane do określonej relacji w Apache Pig. Aby zweryfikować wykonanieLoad musisz użyć Diagnostic Operators. Pig Latin udostępnia cztery różne typy operatorów diagnostycznych -

  • Operator zrzutu
  • Opisz operatora
  • Operator wyjaśnienia
  • Operator ilustracji

W tym rozdziale omówimy operatory Dump języka Pig Latin.

Operator zrzutu

Plik DumpOperator służy do uruchamiania instrukcji Pig Latin i wyświetlania wyników na ekranie. Jest zwykle używany do debugowania celu.

Składnia

Poniżej podano składnię Dump operator.

grunt> Dump Relation_Name

Przykład

Załóżmy, że mamy plik student_data.txt w formacie HDFS z następującą zawartością.

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.

Wczytaliśmy to w relację student używając operatora LOAD, jak pokazano poniżej.

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

Teraz wydrukujmy zawartość relacji za pomocą Dump operator jak pokazano niżej.

grunt> Dump student

Po wykonaniu powyższego Pig Latininstrukcja, uruchomi zadanie MapReduce w celu odczytania danych z HDFS. Wytworzy następujący wynik.

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)

Plik describe operator służy do przeglądania schematu relacji.

Składnia

Składnia describe operator jest następujący -

grunt> Describe Relation_name

Przykład

Załóżmy, że mamy plik student_data.txt w formacie HDFS z następującą zawartością.

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.

Wczytaliśmy to w relację student używając operatora LOAD, jak pokazano poniżej.

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

Teraz opiszmy nazwaną relację student i zweryfikuj schemat, jak pokazano poniżej.

grunt> describe student;

Wynik

Po wykonaniu powyższego Pig Latin instrukcji, wygeneruje następujący wynik.

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

Plik explain Operator służy do wyświetlania planów wykonania logicznych, fizycznych i MapReduce relacji.

Składnia

Poniżej podano składnię explain operator.

grunt> explain Relation_name;

Przykład

Załóżmy, że mamy plik student_data.txt w formacie HDFS z następującą zawartością.

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.

Wczytaliśmy to w relację student używając operatora LOAD, jak pokazano poniżej.

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

Teraz wyjaśnijmy relację nazwaną student, używając explain operator, jak pokazano poniżej.

grunt> explain student;

Wynik

Wytworzy następujący wynik.

$ 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
 ----------------

Plik illustrate operator umożliwia wykonanie sekwencji instrukcji krok po kroku.

Składnia

Poniżej podano składnię illustrate operator.

grunt> illustrate Relation_name;

Przykład

Załóżmy, że mamy plik student_data.txt w formacie HDFS z następującą zawartością.

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.

Wczytaliśmy to w relację student używając operatora LOAD, jak pokazano poniżej.

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

Teraz zilustrujmy relację nazwaną studentem, jak pokazano poniżej.

grunt> illustrate student;

Wynik

Wykonując powyższą instrukcję, otrzymasz następujące dane wyjściowe.

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        |
---------------------------------------------------------------------------------------------

Plik GROUPoperator służy do grupowania danych w jedną lub więcej relacji. Gromadzi dane mające ten sam klucz.

Składnia

Poniżej podano składnię group operator.

grunt> Group_data = GROUP Relation_name BY age;

Przykład

Załóżmy, że mamy plik o nazwie student_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy ten plik do Apache Pig z nazwą relacji student_details jak pokazano niżej.

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);

Teraz pogrupujmy rekordy / krotki w relacji według wieku, jak pokazano poniżej.

grunt> group_data = GROUP student_details by age;

Weryfikacja

Sprawdź relację group_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump group_data;

Wynik

Następnie otrzymasz dane wyjściowe wyświetlające zawartość nazwanej relacji group_datajak pokazano niżej. Tutaj możesz zauważyć, że wynikowy schemat ma dwie kolumny -

  • Jeden jest age, według którego pogrupowaliśmy relację.

  • Drugi to bag, który zawiera grupę krotek, akta uczniów z odpowiednim wiekiem.

(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)})

Możesz zobaczyć schemat tabeli po zgrupowaniu danych za pomocą describe polecenie, jak pokazano poniżej.

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

W ten sam sposób możesz uzyskać przykładową ilustrację schematu przy użyciu illustrate polecenie, jak pokazano poniżej.

$ Illustrate group_data;

Wytworzy następujący wynik -

------------------------------------------------------------------------------------------------- 
|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)}| 
-------------------------------------------------------------------------------------------------

Grupowanie według wielu kolumn

Pogrupujmy relację według wieku i miasta, jak pokazano poniżej.

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

Możesz zweryfikować zawartość relacji o nazwie group_multiple używając operatora Dump, jak pokazano poniżej.

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)})

Group All

Relację można pogrupować według wszystkich kolumn, jak pokazano poniżej.

grunt> group_all = GROUP student_details All;

Teraz zweryfikuj treść relacji group_all jak pokazano niżej.

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)})

Plik COGROUPoperator działa mniej więcej w taki sam sposób, jak operator GROUP . Jedyna różnica między tymi dwoma operatorami polega na tym, żegroup operator jest zwykle używany z jedną relacją, podczas gdy cogroup operator jest używany w instrukcjach obejmujących dwie lub więcej relacji.

Grupowanie dwóch relacji za pomocą Cogroup

Załóżmy, że mamy dwa pliki, a mianowicie student_details.txt i employee_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy te pliki do Pig z nazwami relacji student_details i employee_details odpowiednio, jak pokazano poniżej.

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);

Teraz pogrupujmy rekordy / krotki relacji student_details i employee_details z kluczowym wiekiem, jak pokazano poniżej.

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

Weryfikacja

Sprawdź relację cogroup_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump cogroup_data;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość nazwanej relacji cogroup_data jak pokazano niżej.

(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)})

Plik cogroup operator grupuje krotki z każdej relacji według wieku, gdzie każda grupa przedstawia określoną wartość wieku.

Na przykład, jeśli weźmiemy pod uwagę pierwszą krotkę wyniku, zostanie on pogrupowany według wieku 21 lat i zawiera dwie torby -

  • pierwszy worek zawiera wszystkie krotki z pierwszej relacji (student_details w tym przypadku) mając 21 lat, oraz

  • drugi worek zawiera wszystkie krotki z drugiej relacji (employee_details w tym przypadku) mając 21 lat.

W przypadku, gdy relacja nie ma krotek o wartości wieku 21, zwraca pusty worek.

Plik JOINoperator służy do łączenia rekordów z dwóch lub więcej relacji. Podczas wykonywania operacji łączenia deklarujemy jedną (lub grupę) krotek z każdej relacji jako klucze. Kiedy te klucze są zgodne, dwie konkretne krotki są dopasowywane, w przeciwnym razie rekordy są usuwane. Połączenia mogą być następujących typów -

  • Self-join
  • Inner-join
  • Łączenie zewnętrzne - łączenie lewe, łączenie prawe i łączenie pełne

W tym rozdziale wyjaśniono na przykładach, jak używać operatora sprzężenia w języku Pig Latin. Załóżmy, że mamy dwa pliki, a mianowiciecustomers.txt i orders.txt w /pig_data/ katalog HDFS, jak pokazano poniżej.

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

Załadowaliśmy te dwa pliki do Pig z relacjami customers i orders jak pokazano niżej.

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);

Wykonajmy teraz różne operacje Join na tych dwóch relacjach.

Dołącz do siebie

Self-join służy do łączenia tabeli ze sobą, tak jakby była to dwie relacje, tymczasowo zmieniając nazwę co najmniej jednej relacji.

Generalnie w Apache Pig, aby wykonać samosprzężenie, będziemy ładować te same dane wiele razy, pod różnymi aliasami (nazwami). Dlatego załadujmy zawartość plikucustomers.txt jako dwie tabele, jak pokazano poniżej.

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);

Składnia

Poniżej podano składnię wykonywania self-join operacja za pomocą JOIN operator.

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

Przykład

Pozwól nam występować self-join operacja na relacji customers, łącząc te dwie relacje customers1 i customers2 jak pokazano niżej.

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

Weryfikacja

Sprawdź relację customers3 używając DUMP operator, jak pokazano poniżej.

grunt> Dump customers3;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji 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)

Połączenie wewnętrzne

Inner Joinjest używany dość często; jest również określany jakoequijoin. Sprzężenie wewnętrzne zwraca wiersze, gdy istnieje dopasowanie w obu tabelach.

Tworzy nową relację, łącząc wartości kolumn dwóch relacji (powiedzmy A i B) w oparciu o predykat łączenia. Zapytanie porównuje każdy wiersz A z każdym wierszem B, aby znaleźć wszystkie pary wierszy, które spełniają predykat łączenia. Gdy predykat łączenia jest spełniony, wartości kolumn dla każdej dopasowanej pary wierszy A i B są łączone w wiersz wynikowy.

Składnia

Oto składnia wykonywania inner join operacja za pomocą JOIN operator.

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

Przykład

Pozwól nam występować inner join operacja na dwóch relacjach customers i orders jak pokazano niżej.

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

Weryfikacja

Sprawdź relację coustomer_orders używając DUMP operator, jak pokazano poniżej.

grunt> Dump coustomer_orders;

Wynik

Otrzymasz następujące dane wyjściowe, które będą zawierać zawartość relacji o nazwie 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 -

Połączenie zewnętrzne : w przeciwieństwie do połączenia wewnętrznego,outer joinzwraca wszystkie wiersze z co najmniej jednej relacji. Operacja łączenia zewnętrznego jest wykonywana na trzy sposoby -

  • Lewe połączenie zewnętrzne
  • Prawe połączenie zewnętrzne
  • Pełne połączenie zewnętrzne

Lewe połączenie zewnętrzne

Plik left outer Join operacja zwraca wszystkie wiersze z lewej tabeli, nawet jeśli nie ma żadnych dopasowań w prawej relacji.

Składnia

Poniżej podano składnię wykonywania left outer join operacja za pomocą JOIN operator.

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

Przykład

Wykonajmy operację lewostronnego sprzężenia zewnętrznego na dwóch klientach relacji i zamówieniach, jak pokazano poniżej.

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

Weryfikacja

Sprawdź relację outer_left używając DUMP operator, jak pokazano poniżej.

grunt> Dump outer_left;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji 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,,,,)

Prawe połączenie zewnętrzne

Plik right outer join operacja zwraca wszystkie wiersze z prawej tabeli, nawet jeśli nie ma żadnych dopasowań w lewej tabeli.

Składnia

Poniżej podano składnię wykonywania right outer join operacja za pomocą JOIN operator.

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

Przykład

Pozwól nam występować right outer join operacja na dwóch relacjach customers i orders jak pokazano niżej.

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

Weryfikacja

Sprawdź relację outer_right używając DUMP operator, jak pokazano poniżej.

grunt> Dump outer_right

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji 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)

Pełne połączenie zewnętrzne

Plik full outer join operacja zwraca wiersze, gdy istnieje zgodność w jednej z relacji.

Składnia

Poniżej podano składnię wykonywania full outer join używając JOIN operator.

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

Przykład

Pozwól nam występować full outer join operacja na dwóch relacjach customers i orders jak pokazano niżej.

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

Weryfikacja

Sprawdź relację outer_full używając DUMP operator, jak pokazano poniżej.

grun> Dump outer_full;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji 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,,,,)

Korzystanie z wielu kluczy

Operację JOIN możemy wykonać za pomocą wielu kluczy.

Składnia

Oto jak można wykonać operację JOIN na dwóch tabelach przy użyciu wielu klawiszy.

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

Załóżmy, że mamy dwa pliki, a mianowicie employee.txt i employee_contact.txt w /pig_data/ katalog HDFS, jak pokazano poniżej.

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

Załadowaliśmy te dwa pliki do Pig z relacjami employee i employee_contact jak pokazano niżej.

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);

Teraz połączmy zawartość tych dwóch relacji za pomocą JOIN operator, jak pokazano poniżej.

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

Weryfikacja

Sprawdź relację emp używając DUMP operator, jak pokazano poniżej.

grunt> Dump emp;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość nazwanej relacji emp jak pokazano niżej.

(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)

Plik CROSSoperator oblicza iloczyn krzyżowy dwóch lub więcej relacji. Ten rozdział wyjaśnia na przykładzie, jak używać operatora krzyżyka w języku Pig Latin.

Składnia

Poniżej podano składnię CROSS operator.

grunt> Relation3_name = CROSS Relation1_name, Relation2_name;

Przykład

Załóżmy, że mamy dwa pliki, a mianowicie customers.txt i orders.txt w /pig_data/ katalog HDFS, jak pokazano poniżej.

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

Załadowaliśmy te dwa pliki do Pig z relacjami customers i orders jak pokazano niżej.

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);

Uzyskajmy teraz iloczyn krzyżowy tych dwóch relacji, używając cross operator na tych dwóch relacjach, jak pokazano poniżej.

grunt> cross_data = CROSS customers, orders;

Weryfikacja

Sprawdź relację cross_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump cross_data;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji 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)

Plik UNIONoperator Pig Latin służy do scalenia zawartości dwóch relacji. Aby wykonać operację UNION na dwóch relacjach, ich kolumny i domeny muszą być identyczne.

Składnia

Poniżej podano składnię UNION operator.

grunt> Relation_name3 = UNION Relation_name1, Relation_name2;

Przykład

Załóżmy, że mamy dwa pliki, a mianowicie student_data1.txt i student_data2.txt w /pig_data/ katalog HDFS, jak pokazano poniżej.

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.

Załadowaliśmy te dwa pliki do Pig z relacjami student1 i student2 jak pokazano niżej.

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);

Połączmy teraz zawartość tych dwóch relacji za pomocą UNION operator, jak pokazano poniżej.

grunt> student = UNION student1, student2;

Weryfikacja

Sprawdź relację student używając DUMP operator, jak pokazano poniżej.

grunt> Dump student;

Wynik

Wyświetli następujące dane wyjściowe, wyświetlając zawartość relacji 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)

Plik SPLIT operator służy do dzielenia relacji na dwie lub więcej relacji.

Składnia

Poniżej podano składnię SPLIT operator.

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

Przykład

Załóżmy, że mamy plik o nazwie student_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy ten plik do Pig z nazwą relacji student_details jak pokazano niżej.

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);

Podzielmy teraz relację na dwie, z których jedna zawiera listę pracowników w wieku poniżej 23 lat, a druga pracowników w wieku od 22 do 25 lat.

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

Weryfikacja

Sprawdź relacje student_details1 i student_details2 używając DUMP operator, jak pokazano poniżej.

grunt> Dump student_details1;  

grunt> Dump student_details2;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji student_details1 i student_details2 odpowiednio.

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)

Plik FILTER operator służy do wybierania wymaganych krotek z relacji opartej na warunku.

Składnia

Poniżej podano składnię FILTER operator.

grunt> Relation2_name = FILTER Relation1_name BY (condition);

Przykład

Załóżmy, że mamy plik o nazwie student_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy ten plik do Pig z nazwą relacji student_details jak pokazano niżej.

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);

Użyjmy teraz operatora filtru, aby uzyskać szczegółowe informacje o uczniach, którzy należą do miasta Chennai.

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

Weryfikacja

Sprawdź relację filter_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump filter_data;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji filter_data następująco.

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

Plik DISTINCT Operator służy do usuwania zbędnych (zduplikowanych) krotek z relacji.

Składnia

Poniżej podano składnię DISTINCT operator.

grunt> Relation_name2 = DISTINCT Relatin_name1;

Przykład

Załóżmy, że mamy plik o nazwie student_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy ten plik do Pig z nazwą relacji student_details jak pokazano niżej.

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);

Usuńmy teraz zbędne (zduplikowane) krotki z nazwanej relacji student_details używając DISTINCT operator i zapisz go jako inną relację o nazwie distinct_data jak pokazano niżej.

grunt> distinct_data = DISTINCT student_details;

Weryfikacja

Sprawdź relację distinct_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump distinct_data;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji distinct_data następująco.

(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)

Plik FOREACH Operator służy do generowania określonych przekształceń danych na podstawie danych kolumny.

Składnia

Poniżej podano składnię FOREACH operator.

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

Przykład

Załóżmy, że mamy plik o nazwie student_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy ten plik do Pig z nazwą relacji student_details jak pokazano niżej.

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);

Przyjrzyjmy się teraz z relacji wartości identyfikatora, wieku i miasta każdego ucznia student_details i zapisz go w innej relacji o nazwie foreach_data używając foreach operator, jak pokazano poniżej.

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

Weryfikacja

Sprawdź relację foreach_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump foreach_data;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji 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)

Plik ORDER BY operator służy do wyświetlania zawartości relacji w porządku posortowanym na podstawie jednego lub większej liczby pól.

Składnia

Poniżej podano składnię ORDER BY operator.

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

Przykład

Załóżmy, że mamy plik o nazwie student_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy ten plik do Pig z nazwą relacji student_details jak pokazano niżej.

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);

Sortujmy teraz relację w porządku malejącym na podstawie wieku ucznia i zapiszmy ją w innej relacji o nazwie order_by_data używając ORDER BY operator, jak pokazano poniżej.

grunt> order_by_data = ORDER student_details BY age DESC;

Weryfikacja

Sprawdź relację order_by_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump order_by_data;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji 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)

Plik LIMIT operator jest używany do uzyskania ograniczonej liczby krotek z relacji.

Składnia

Poniżej podano składnię LIMIT operator.

grunt> Result = LIMIT Relation_name required number of tuples;

Przykład

Załóżmy, że mamy plik o nazwie student_details.txt w katalogu HDFS /pig_data/ jak pokazano niżej.

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

Załadowaliśmy ten plik do Pig z nazwą relacji student_details jak pokazano niżej.

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);

Teraz posortujmy relację w porządku malejącym na podstawie wieku ucznia i zapiszmy ją w innej relacji o nazwie limit_data używając ORDER BY operator, jak pokazano poniżej.

grunt> limit_data = LIMIT student_details 4;

Weryfikacja

Sprawdź relację limit_data używając DUMP operator, jak pokazano poniżej.

grunt> Dump limit_data;

Wynik

Spowoduje to wyświetlenie następującego wyniku, wyświetlając zawartość relacji limit_data następująco.

(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 zapewnia różne wbudowane funkcje, a mianowicie eval, load, store, math, string, bag i tuple Funkcje.

Funkcje ewaluacyjne

Poniżej znajduje się lista eval funkcje dostarczane przez Apache Pig.

SN Opis funkcji
1 ŚR ()

Obliczenie średniej wartości liczbowych w worku.

2 BagToString ()

Aby połączyć elementy torby w sznurek. Podczas konkatenacji możemy umieścić separator między tymi wartościami (opcjonalnie).

3 CONCAT ()

Aby połączyć dwa lub więcej wyrażeń tego samego typu.

4 LICZYĆ()

Aby uzyskać liczbę elementów w woreczku, zliczając liczbę krotek w woreczku.

5 COUNT_STAR ()

Jest podobny do COUNT()funkcjonować. Służy do określenia liczby elementów w worku.

6 DIFF ()

Aby porównać dwie torby (pola) w krotce.

7 Jest pusty()

Aby sprawdzić, czy torba lub mapa jest pusta.

8 MAX ()

Aby obliczyć najwyższą wartość dla kolumny (wartości liczbowe lub znaki) w worku z jedną kolumną.

9 MIN ()

Aby uzyskać minimalną (najniższą) wartość (numeryczną lub znakową) dla określonej kolumny w pakiecie z jedną kolumną.

10 PluckTuple ()

Korzystanie z łaciny Pig PluckTuple() funkcji, możemy zdefiniować prefiks ciągu i filtrować kolumny w relacji zaczynającej się od podanego przedrostka.

11 ROZMIAR()

Aby obliczyć liczbę elementów na podstawie dowolnego typu danych Pig.

12 ODEJMOWAĆ()

Aby odjąć dwie torby. Przyjmuje dwie torby jako dane wejściowe i zwraca torbę, która zawiera krotki pierwszej torby, których nie ma w drugiej torbie.

13 SUMA()

Aby uzyskać sumę wartości liczbowych kolumny w pakiecie z jedną kolumną.

14 TOKENIZE ()

Aby podzielić ciąg (który zawiera grupę słów) w pojedynczej krotce i zwrócić pakiet zawierający dane wyjściowe operacji podziału.

Plik Load i Storefunkcje w Apache Pig służą do określania, w jaki sposób dane wychodzą z Pig. Te funkcje są używane z operatorami ładowania i przechowywania. Poniżej podano listę funkcji ładowania i przechowywania dostępnych w Pig.

SN Opis funkcji
1 PigStorage ()

Do ładowania i przechowywania plików strukturalnych.

2 TextLoader ()

Aby załadować nieustrukturyzowane dane do Pig.

3 BinStorage ()

Aby załadować i przechowywać dane w Pig przy użyciu formatu do odczytu maszynowego.

4 Obsługa kompresji

W Pig Latin możemy ładować i przechowywać skompresowane dane.

Poniżej podano listę funkcji torby i krotki.

SN Opis funkcji
1 DO TORBY()

Aby zamienić dwa lub więcej wyrażeń w torbę.

2 TOP()

Aby dostać się na szczyt N krotki relacji.

3 TOTUPLE ()

Aby przekształcić jedno lub więcej wyrażeń w krotkę.

4 TOMAP ()

Aby przekształcić pary klucz-wartość w Map.

W Apache Pig mamy następujące funkcje String.

SN Funkcje i opis
1 ENDSWITH (ciąg; testAgainst)

Aby sprawdzić, czy dany ciąg kończy się określonym podciągiem.

2 STARTSWITH (ciąg; podciąg)

Akceptuje dwa parametry łańcuchowe i sprawdza, czy pierwszy ciąg zaczyna się od drugiego.

3 SUBSTRING (ciąg; startIndex; stopIndex)

Zwraca podciąg z podanego ciągu.

4 EqualsIgnoreCase (ciąg1, ciąg2)

Aby porównać dwa użądlenia, ignorując przypadek.

5 INDEXOF (ciąg; „znak”; startIndex)

Zwraca pierwsze wystąpienie znaku w ciągu, wyszukując w przód od indeksu początkowego.

6 LAST_INDEX_OF (wyrażenie)

Zwraca indeks ostatniego wystąpienia znaku w ciągu, wyszukując wstecz od indeksu początkowego.

7 LCFIRST (wyrażenie)

Konwertuje pierwszy znak w ciągu na małe litery.

8 UCFIRST (wyrażenie)

Zwraca ciąg z pierwszym znakiem zamienionym na wielką literę.

9 UPPER (wyrażenie)

UPPER (wyrażenie) Zwraca ciąg zamieniony na wielkie litery.

10 LOWER (wyrażenie)

Konwertuje wszystkie znaki w ciągu na małe litery.

11 REPLACE (string, 'oldChar', 'newChar');

Aby zastąpić istniejące znaki w ciągu nowymi znakami.

12 STRSPLIT (ciąg; wyrażenie regularne; limit)

Aby podzielić ciąg wokół dopasowań danego wyrażenia regularnego.

13 STRSPLITTOBAG (ciąg; wyrażenie regularne; limit)

Podobny do STRSPLIT() funkcja, dzieli ciąg według podanego separatora i zwraca wynik w worku.

14 TRIM (wyrażenie)

Zwraca kopię ciągu z usuniętymi początkowymi i końcowymi białymi znakami.

15 LTRIM (wyrażenie)

Zwraca kopię ciągu z usuniętymi wiodącymi białymi znakami.

16 RTRIM (wyrażenie)

Zwraca kopię ciągu z usuniętymi końcowymi spacjami.

Apache Pig zapewnia następujące funkcje daty i czasu -

SN Funkcje i opis
1 ToDate (milisekundy)

Ta funkcja zwraca obiekt daty i godziny zgodnie z podanymi parametrami. Inną alternatywą dla tej funkcji są ToDate (iosstring), ToDate (userstring, format), ToDate (userstring, format, timezone)

2 Obecny czas()

zwraca obiekt daty i godziny bieżącej godziny.

3 GetDay (data i godzina)

Zwraca dzień miesiąca z obiektu data-godzina.

4 GetHour (data i godzina)

Zwraca godzinę dnia z obiektu daty i godziny.

5 GetMilliSecond (datetime)

Zwraca milisekundę sekundy z obiektu daty i godziny.

6 GetMinute (datetime)

Zwraca minutę godziny z obiektu daty i godziny.

7 GetMonth (data i godzina)

Zwraca miesiąc w roku z obiektu data-godzina.

8 GetSecond (datetime)

Zwraca sekundę minuty z obiektu daty i godziny.

9 GetWeek (data i godzina)

Zwraca tydzień roku z obiektu daty i godziny.

10 GetWeekYear (data i godzina)

Zwraca rok tygodnia z obiektu daty i godziny.

11 GetYear (data i godzina)

Zwraca rok z obiektu daty i godziny.

12 AddDuration (data i godzina, czas trwania)

Zwraca wynik obiektu daty i godziny wraz z obiektem czasu trwania.

13 SubtractDuration (data / godzina, czas trwania)

Odejmuje obiekt Duration od obiektu Date-Time i zwraca wynik.

14 DaysBetween (datetime1, datetime2)

Zwraca liczbę dni między dwoma obiektami daty i godziny.

15 HoursBetween (datetime1, datetime2)

Zwraca liczbę godzin między dwoma obiektami daty i godziny.

16 MilliSecondsBetween (datetime1, datetime2)

Zwraca liczbę milisekund między dwoma obiektami daty i godziny.

17 MinutyBetween (datetime1, datetime2)

Zwraca liczbę minut między dwoma obiektami daty i godziny.

18 MonthsBetween (datetime1, datetime2)

Zwraca liczbę miesięcy między dwoma obiektami daty i godziny.

19 SecondsBetween (datetime1, datetime2)

Zwraca liczbę sekund między dwoma obiektami daty i godziny.

20 WeeksBetween (datetime1, datetime2)

Zwraca liczbę tygodni między dwoma obiektami daty i godziny.

21 YearsBetween (datetime1, datetime2)

Zwraca liczbę lat między dwoma obiektami daty i godziny.

W Apache Pig mamy następujące funkcje matematyczne -

SN Funkcje i opis
1 ABS (wyrażenie)

Aby uzyskać wartość bezwzględną wyrażenia.

2 ACOS (wyrażenie)

Aby uzyskać arcus cosinus wyrażenia.

3 ASIN (wyrażenie)

Aby uzyskać łuk sinusoidalny wyrażenia.

4 ATAN (wyrażenie)

Ta funkcja służy do uzyskania stycznej łuku wyrażenia.

5 CBRT (wyrażenie)

Ta funkcja służy do pobierania pierwiastka sześciennego wyrażenia.

6 CEIL (wyrażenie)

Ta funkcja jest używana do uzyskania wartości wyrażenia zaokrąglonej w górę do najbliższej liczby całkowitej.

7 COS (wyrażenie)

Ta funkcja służy do uzyskania cosinusa trygonometrycznego wyrażenia.

8 COSH (wyrażenie)

Ta funkcja jest używana do uzyskania cosinusa hiperbolicznego wyrażenia.

9 EXP (wyrażenie)

Ta funkcja służy do podniesienia liczby Eulera do potęgi x.

10 FLOOR (wyrażenie)

Aby uzyskać wartość wyrażenia zaokrągloną w dół do najbliższej liczby całkowitej.

11 LOG (wyrażenie)

Aby uzyskać logarytm naturalny (podstawa e) wyrażenia.

12 LOG10 (wyrażenie)

Aby uzyskać logarytm dziesiętny z wyrażenia.

13 LOSOWY( )

Aby uzyskać liczbę pseudolosową (wpisz double) większą lub równą 0,0 i mniejszą niż 1,0.

14 ROUND (wyrażenie)

Aby uzyskać wartość wyrażenia zaokrągloną do liczby całkowitej (jeśli typ wyniku jest zmiennoprzecinkowy) lub zaokrągloną do długości (jeśli typ wyniku jest podwójny).

15 SIN (wyrażenie)

Aby uzyskać sinus wyrażenia.

16 SINH (wyrażenie)

Aby uzyskać hiperboliczny sinus wyrażenia.

17 SQRT (wyrażenie)

Aby uzyskać dodatni pierwiastek kwadratowy z wyrażenia.

18 TAN (wyrażenie)

Aby uzyskać trygonometryczną styczną kąta.

19 TANH (wyrażenie)

Aby uzyskać hiperboliczną tangens wyrażenia.

Oprócz wbudowanych funkcji, Apache Pig zapewnia szerokie wsparcie dla User Defined Functions (UDF). Korzystając z tych UDF, możemy definiować własne funkcje i używać ich. Obsługa UDF jest dostępna w sześciu językach programowania, a mianowicie w Java, Jython, Python, JavaScript, Ruby i Groovy.

W przypadku pisania UDF pełne wsparcie jest zapewniane w języku Java, a ograniczone wsparcie jest zapewniane we wszystkich pozostałych językach. Używając języka Java, można pisać UDF obejmujące wszystkie części przetwarzania, takie jak ładowanie / przechowywanie danych, transformacja kolumn i agregacja. Odkąd Apache Pig został napisany w Javie, UDF napisany w języku Java działa wydajnie w porównaniu z innymi językami.

W Apache Pig mamy również repozytorium Java dla UDF o nazwie Piggybank. Korzystając z Piggybank, możemy uzyskać dostęp do Java UDF napisanych przez innych użytkowników i wnieść własne UDF.

Rodzaje UDF w Javie

Pisząc UDF w Javie, możemy tworzyć i używać następujących trzech typów funkcji -

  • Filter Functions- Funkcje filtrujące są używane jako warunki w instrukcjach filtrujących. Te funkcje akceptują wartość Pig jako dane wejściowe i zwracają wartość logiczną.

  • Eval Functions- Funkcje Eval są używane w instrukcjach FOREACH-GENERATE. Te funkcje akceptują wartość Pig jako dane wejściowe i zwracają wynik Pig.

  • Algebraic Functions- Funkcje algebraiczne działają na worki wewnętrzne w instrukcji FOREACHGENERATE. Te funkcje są używane do wykonywania pełnych operacji MapReduce na wewnętrznej torbie.

Pisanie UDF w Javie

Aby napisać UDF przy użyciu Javy, musimy zintegrować plik jar Pig-0.15.0.jar. W tej sekcji omówimy, jak napisać przykładowy plik UDF za pomocą Eclipse. Zanim przejdziesz dalej, upewnij się, że zainstalowałeś Eclipse i Maven w swoim systemie.

Wykonaj czynności podane poniżej, aby napisać funkcję UDF -

  • Otwórz Eclipse i utwórz nowy projekt (powiedzmy myproject).

  • Przekonwertuj nowo utworzony projekt na projekt Maven.

  • Skopiuj następującą zawartość w pom.xml. Ten plik zawiera zależności Maven dla plików jar Apache Pig i 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>
  • Zapisz plik i odśwież go. wMaven Dependencies w sekcji możesz znaleźć pobrane pliki jar.

  • Utwórz nowy plik klasy o nazwie Sample_Eval i skopiuj w nim następującą zawartość.

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();  
   } 
}

Podczas pisania UDF jest obowiązkowe dziedziczenie klasy EvalFunc i zapewnienie implementacji do exec()funkcjonować. W ramach tej funkcji zapisywany jest kod wymagany dla UDF. W powyższym przykładzie zwróciliśmy kod konwertujący zawartość danej kolumny na wielkie litery.

  • Po skompilowaniu klasy bez błędów kliknij prawym przyciskiem myszy plik Sample_Eval.java. To daje ci menu. Wybierzexport jak pokazano na poniższym zrzucie ekranu.

  • Po kliknięciu export, pojawi się następujące okno. KliknijJAR file.

  • Przejdź dalej, klikając Next>przycisk. Otrzymasz kolejne okno, w którym musisz wprowadzić ścieżkę w lokalnym systemie plików, w którym musisz zapisać plik jar.

  • Na koniec kliknij Finishprzycisk. W określonym folderze plik Jarsample_udf.jarjest tworzone. Ten plik jar zawiera UDF napisany w Javie.

Korzystanie z UDF

Po zapisaniu UDF i wygenerowaniu pliku Jar, wykonaj kroki podane poniżej -

Krok 1: Rejestracja pliku Jar

Po zapisaniu UDF (w Javie) musimy zarejestrować plik Jar, który zawiera UDF za pomocą operatora Register. Rejestrując plik Jar, użytkownicy mogą określić lokalizację UDF w Apache Pig.

Syntax

Poniżej podano składnię operatora rejestru.

REGISTER path;

Example

Jako przykład zarejestrujmy plik sample_udf.jar utworzony wcześniej w tym rozdziale.

Uruchom Apache Pig w trybie lokalnym i zarejestruj plik jar sample_udf.jar, jak pokazano poniżej.

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

REGISTER '/$PIG_HOME/sample_udf.jar'

Note - załóż plik Jar w ścieżce - /$PIG_HOME/sample_udf.jar

Krok 2: Definiowanie aliasu

Po zarejestrowaniu UDF możemy zdefiniować do niego alias za pomocą rozszerzenia Define operator.

Syntax

Poniżej podano składnię operatora Define.

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

Example

Zdefiniuj alias dla sample_eval, jak pokazano poniżej.

DEFINE sample_eval sample_eval();

Krok 3: Korzystanie z UDF

Po zdefiniowaniu aliasu możesz używać UDF tak samo, jak funkcji wbudowanych. Załóżmy, że w HDFS znajduje się plik o nazwie emp_data/Pig_Data/ katalog z następującą zawartością.

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

I załóżmy, że załadowaliśmy ten plik do Pig, jak pokazano poniżej.

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

Zamieńmy teraz nazwiska pracowników na wielkie litery, używając UDF sample_eval.

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

Sprawdź zawartość relacji Upper_case jak pokazano niżej.

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

W tym rozdziale zobaczymy, jak uruchamiać skrypty Apache Pig w trybie wsadowym.

Komentarze w skrypcie świni

Pisząc skrypt w pliku, możemy dołączyć do niego komentarze, jak pokazano poniżej.

Komentarze wielowierszowe

Zaczniemy wielowierszowe komentarze od „/ *”, a zakończymy na „* /”.

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

Komentarze jednowierszowe

Zaczynamy jednowierszowe komentarze od „-”.

--we can write single line comments like this.

Wykonywanie skryptu świni w trybie wsadowym

Podczas wykonywania instrukcji Apache Pig w trybie wsadowym postępuj zgodnie z instrukcjami podanymi poniżej.

Krok 1

Zapisz wszystkie wymagane instrukcje Pig Latin w jednym pliku. Możemy zapisać wszystkie instrukcje i polecenia Pig Latin w jednym pliku i zapisać jako.pig plik.

Krok 2

Uruchom skrypt Apache Pig. Możesz wykonać skrypt Pig z powłoki (Linux), jak pokazano poniżej.

Tryb lokalny Tryb MapReduce
$ pig -x local Sample_script.pig $ pig -x mapreduce Sample_script.pig

Możesz go również uruchomić z powłoki Grunt, używając polecenia exec, jak pokazano poniżej.

grunt> exec /sample_script.pig

Wykonywanie skryptu świni z HDFS

Możemy również wykonać skrypt Pig, który znajduje się w HDFS. Załóżmy, że istnieje skrypt Pig z nazwąSample_script.pig w katalogu HDFS o nazwie /pig_data/. Możemy to wykonać, jak pokazano poniżej.

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

Przykład

Załóżmy, że mamy plik student_details.txt w formacie HDFS z następującą zawartością.

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

Mamy też przykładowy skrypt z nazwą sample_script.pig, w tym samym katalogu HDFS. Ten plik zawiera instrukcje wykonujące operacje i przekształcenia nastudent relacji, jak pokazano poniżej.

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;
  • Pierwsza instrukcja skryptu załaduje dane z pliku o nazwie student_details.txt jako nazwanej relacji student.

  • Druga instrukcja skryptu uporządkuje krotki relacji w porządku malejącym na podstawie wieku i zapisze ją jako student_order.

  • Trzecia instrukcja skryptu będzie przechowywać pierwsze 4 krotki student_order tak jak student_limit.

  • Wreszcie czwarta instrukcja zrzuci zawartość relacji student_limit.

Wykonajmy teraz sample_script.pig jak pokazano niżej.

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

Apache Pig zostanie wykonany i wyświetli dane wyjściowe z następującą zawartością.

(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)