Apache Pig - Hướng dẫn nhanh
Apache Pig là gì?
Apache Pig là một trừu tượng so với MapReduce. Nó là một công cụ / nền tảng được sử dụng để phân tích các bộ dữ liệu lớn hơn biểu thị chúng dưới dạng các luồng dữ liệu. Pig thường được sử dụng vớiHadoop; chúng ta có thể thực hiện tất cả các thao tác xử lý dữ liệu trong Hadoop bằng Apache Pig.
Để viết các chương trình phân tích dữ liệu, Pig cung cấp một ngôn ngữ cấp cao được gọi là Pig Latin. Ngôn ngữ này cung cấp các toán tử khác nhau sử dụng mà các lập trình viên có thể phát triển các chức năng của riêng họ để đọc, viết và xử lý dữ liệu.
Để phân tích dữ liệu bằng cách sử dụng Apache Pig, người lập trình cần viết script bằng ngôn ngữ Pig Latin. Tất cả các tập lệnh này được chuyển đổi nội bộ thành các tác vụ Bản đồ và Rút gọn. Apache Pig có một thành phần được gọi làPig Engine chấp nhận các tập lệnh Pig Latin làm đầu vào và chuyển đổi các tập lệnh đó thành các công việc MapReduce.
Tại sao chúng ta cần Apache Pig?
Các lập trình viên không giỏi Java thường gặp khó khăn khi làm việc với Hadoop, đặc biệt khi thực hiện bất kỳ tác vụ MapReduce nào. Apache Pig là một lợi ích cho tất cả các lập trình viên như vậy.
Sử dụng Pig Latin, lập trình viên có thể thực hiện các tác vụ MapReduce một cách dễ dàng mà không cần phải gõ các mã phức tạp trong Java.
Apache Pig sử dụng multi-query approach, do đó làm giảm độ dài của mã. Ví dụ: một hoạt động yêu cầu bạn nhập 200 dòng mã (LoC) trong Java có thể dễ dàng thực hiện bằng cách nhập ít hơn chỉ 10 LoC trong Apache Pig. Cuối cùng thì Apache Pig giảm thời gian phát triển gần 16 lần.
Pig Latin là SQL-like language và rất dễ học Apache Pig khi bạn đã quen với SQL.
Apache Pig cung cấp nhiều toán tử tích hợp để hỗ trợ các hoạt động dữ liệu như nối, bộ lọc, sắp xếp thứ tự, v.v. Ngoài ra, nó cũng cung cấp các loại dữ liệu lồng nhau như bộ giá trị, túi và bản đồ bị thiếu trong MapReduce.
Đặc điểm của lợn
Apache Pig đi kèm với các tính năng sau:
Rich set of operators - Nó cung cấp nhiều toán tử để thực hiện các thao tác như nối, sắp xếp, lọc, v.v.
Ease of programming - Pig Latin tương tự như SQL và rất dễ dàng để viết một tập lệnh Pig nếu bạn giỏi SQL.
Optimization opportunities - Các tác vụ trong Apache Pig tự động tối ưu hóa việc thực thi của chúng, vì vậy người lập trình chỉ cần tập trung vào ngữ nghĩa của ngôn ngữ.
Extensibility - Sử dụng các toán tử hiện có, người dùng có thể phát triển các chức năng của riêng họ để đọc, xử lý và ghi dữ liệu.
UDF’s - Heo cung cấp cơ sở để tạo User-defined Functions bằng các ngôn ngữ lập trình khác như Java và gọi hoặc nhúng chúng vào Pig Scripts.
Handles all kinds of data- Apache Pig phân tích tất cả các loại dữ liệu, cả có cấu trúc cũng như không có cấu trúc. Nó lưu trữ các kết quả trong HDFS.
Apache Pig Vs MapReduce
Dưới đây là những điểm khác biệt chính giữa Apache Pig và MapReduce.
Apache Pig | MapReduce |
---|---|
Apache Pig là một ngôn ngữ luồng dữ liệu. | MapReduce là một mô hình xử lý dữ liệu. |
Nó là một ngôn ngữ cấp cao. | MapReduce là cấp thấp và cứng nhắc. |
Thực hiện thao tác Tham gia trong Apache Pig khá đơn giản. | Khá khó khăn trong MapReduce để thực hiện thao tác Nối giữa các tập dữ liệu. |
Bất kỳ lập trình viên mới nào có kiến thức cơ bản về SQL đều có thể làm việc thuận tiện với Apache Pig. | Tiếp xúc với Java là phải làm việc với MapReduce. |
Apache Pig sử dụng phương pháp tiếp cận đa truy vấn, do đó giảm độ dài của các mã đến một mức độ lớn. | MapReduce sẽ yêu cầu số dòng nhiều hơn gần 20 lần để thực hiện cùng một nhiệm vụ. |
Không cần biên dịch. Khi thực thi, mọi toán tử Apache Pig được chuyển đổi nội bộ thành một công việc MapReduce. | Các công việc MapReduce có một quá trình biên dịch lâu dài. |
Apache Pig Vs SQL
Dưới đây là những điểm khác biệt chính giữa Apache Pig và SQL.
Con lợn | SQL |
---|---|
Pig Latin là một procedural ngôn ngữ. | SQL là một declarative ngôn ngữ. |
Trong Apache Pig, schemaLà tùy chọn. Chúng tôi có thể lưu trữ dữ liệu mà không cần thiết kế giản đồ (các giá trị được lưu trữ dưới dạng$01, $02, v.v.) | Lược đồ là bắt buộc trong SQL. |
Mô hình dữ liệu trong Apache Pig là nested relational. | Mô hình dữ liệu được sử dụng trong SQL is flat relational. |
Apache Pig cung cấp cơ hội hạn chế cho Query optimization. | Có nhiều cơ hội hơn để tối ưu hóa truy vấn trong SQL. |
Ngoài những điểm khác biệt trên, Apache Pig Latin -
- Cho phép phân chia trong đường ống.
- Cho phép các nhà phát triển lưu trữ dữ liệu ở bất kỳ đâu trong đường dẫn.
- Khai báo các kế hoạch thực hiện.
- Cung cấp các toán tử để thực hiện các chức năng ETL (Trích xuất, Biến đổi và Tải).
Apache Pig Vs Hive
Cả Apache Pig và Hive đều được sử dụng để tạo các công việc MapReduce. Và trong một số trường hợp, Hive hoạt động trên HDFS theo cách tương tự như Apache Pig. Trong bảng sau, chúng tôi đã liệt kê một vài điểm quan trọng giúp Apache Pig khác biệt với Hive.
Apache Pig | Hive |
---|---|
Apache Pig sử dụng một ngôn ngữ gọi là Pig Latin. Ban đầu nó được tạo tạiYahoo. | Hive sử dụng một ngôn ngữ gọi là HiveQL. Ban đầu nó được tạo tạiFacebook. |
Pig Latin là một ngôn ngữ luồng dữ liệu. | HiveQL là một ngôn ngữ xử lý truy vấn. |
Pig Latin là một ngôn ngữ thủ tục và nó phù hợp với mô hình đường ống. | HiveQL là một ngôn ngữ khai báo. |
Apache Pig có thể xử lý dữ liệu có cấu trúc, phi cấu trúc và bán cấu trúc. | Hive chủ yếu dành cho dữ liệu có cấu trúc. |
Các ứng dụng của Apache Pig
Apache Pig thường được các nhà khoa học dữ liệu sử dụng để thực hiện các nhiệm vụ liên quan đến xử lý đặc biệt và tạo mẫu nhanh. Apache Pig được sử dụng -
- Để xử lý các nguồn dữ liệu khổng lồ như nhật ký web.
- Để thực hiện xử lý dữ liệu cho các nền tảng tìm kiếm.
- Để xử lý tải dữ liệu nhạy cảm về thời gian.
Apache Pig - Lịch sử
Trong 2006, Apache Pig được phát triển như một dự án nghiên cứu tại Yahoo, đặc biệt là để tạo và thực thi các công việc MapReduce trên mọi tập dữ liệu. Trong2007, Apache Pig được mở nguồn thông qua lồng ấp Apache. Trong2008, bản phát hành đầu tiên của Apache Pig ra mắt. Trong2010, Apache Pig đã tốt nghiệp với tư cách là một dự án cấp cao nhất của Apache.
Ngôn ngữ được sử dụng để phân tích dữ liệu trong Hadoop bằng Pig được gọi là Pig Latin. Nó là một ngôn ngữ xử lý dữ liệu cấp cao, cung cấp một tập hợp các kiểu dữ liệu và toán tử phong phú để thực hiện các hoạt động khác nhau trên dữ liệu.
Để thực hiện một tác vụ cụ thể Lập trình viên sử dụng Pig, người lập trình cần viết tập lệnh Pig bằng ngôn ngữ Pig Latin và thực hiện chúng bằng bất kỳ cơ chế thực thi nào (Grunt Shell, UDFs, Embedded). Sau khi thực thi, các tập lệnh này sẽ trải qua một loạt các biến đổi được áp dụng bởi Pig Framework, để tạo ra đầu ra mong muốn.
Bên trong, Apache Pig chuyển đổi các tập lệnh này thành một loạt các công việc MapReduce và do đó, nó giúp công việc của lập trình viên trở nên dễ dàng. Kiến trúc của Apache Pig được hiển thị bên dưới.
Các thành phần của Apache Pig
Như trong hình, có nhiều thành phần khác nhau trong khung Apache Pig. Hãy để chúng tôi xem xét các thành phần chính.
Trình phân tích cú pháp
Ban đầu, các tập lệnh Pig được xử lý bởi Trình phân tích cú pháp. Nó kiểm tra cú pháp của script, kiểm tra kiểu và kiểm tra linh tinh khác. Đầu ra của trình phân tích cú pháp sẽ là DAG (đồ thị xoay chiều có hướng), đại diện cho các câu lệnh Pig Latin và các toán tử logic.
Trong DAG, các toán tử logic của tập lệnh được biểu diễn dưới dạng các nút và các luồng dữ liệu được biểu diễn dưới dạng các cạnh.
Trình tối ưu hóa
Kế hoạch logic (DAG) được chuyển đến trình tối ưu hóa logic, bộ này thực hiện các tối ưu hóa logic như phép chiếu và kéo xuống.
Trình biên dịch
Trình biên dịch biên dịch kế hoạch logic đã được tối ưu hóa thành một chuỗi các công việc MapReduce.
Công cụ thực thi
Cuối cùng các công việc MapReduce được gửi đến Hadoop theo thứ tự đã được sắp xếp. Cuối cùng, các công việc MapReduce này được thực thi trên Hadoop với kết quả mong muốn.
Mô hình dữ liệu Latinh lợn
Mô hình dữ liệu của Pig Latin được lồng vào nhau hoàn toàn và nó cho phép các kiểu dữ liệu phi nguyên tử phức tạp như map và tuple. Dưới đây là biểu đồ biểu diễn mô hình dữ liệu của Pig Latin.
Atom
Bất kỳ giá trị đơn lẻ nào trong Pig Latin, bất kể dữ liệu của chúng, kiểu được gọi là Atom. Nó được lưu trữ dưới dạng chuỗi và có thể được sử dụng dưới dạng chuỗi và số. int, long, float, double, chararray và bytearray là các giá trị nguyên tử của Pig. Một phần dữ liệu hoặc một giá trị nguyên tử đơn giản được gọi làfield.
Example - 'raja' hoặc '30'
Tuple
Một bản ghi được hình thành bởi một tập hợp các trường có thứ tự được gọi là một bộ, các trường có thể thuộc bất kỳ loại nào. Một bộ tương tự như một hàng trong bảng RDBMS.
Example - (Raja, 30 tuổi)
Túi
Túi là một tập hợp các bộ giá trị không có thứ tự. Nói cách khác, một bộ sưu tập các bộ giá trị (không phải là duy nhất) được gọi là một chiếc túi. Mỗi tuple có thể có bất kỳ số lượng trường nào (lược đồ linh hoạt). Túi được đại diện bởi '{}'. Nó tương tự như một bảng trong RDBMS, nhưng không giống như một bảng trong RDBMS, không nhất thiết mọi bộ đều chứa cùng một số trường hoặc các trường ở cùng một vị trí (cột) phải có cùng một kiểu.
Example - {(Raja, 30 tuổi), (Mohammad, 45 tuổi)}
Một túi có thể là một trường trong một mối quan hệ; trong bối cảnh đó, nó được gọi làinner bag.
Example- {Raja, 30 tuổi, {9848022338, [email protected],} }
Bản đồ
Bản đồ (hoặc bản đồ dữ liệu) là một tập hợp các cặp khóa-giá trị. Cáckeycần phải là loại chararray và phải là duy nhất. Cácvaluecó thể thuộc bất kỳ loại nào. Nó được đại diện bởi '[]'
Example - [tên # Raja, # 30 tuổi]
Quan hệ
Một mối quan hệ là một túi các bộ giá trị. Các quan hệ trong Pig Latin không có thứ tự (không có gì đảm bảo rằng các bộ giá trị được xử lý theo bất kỳ thứ tự cụ thể nào).
Chương này giải thích cách tải xuống, cài đặt và thiết lập Apache Pig trong hệ thống của bạn.
Điều kiện tiên quyết
Điều cần thiết là bạn phải cài đặt Hadoop và Java trên hệ thống của mình trước khi sử dụng Apache Pig. Do đó, trước khi cài đặt Apache Pig, hãy cài đặt Hadoop và Java bằng cách làm theo các bước được cung cấp trong liên kết sau:
http://www.tutorialspoint.com/hadoop/hadoop_enviornment_setup.htm
Tải xuống Apache Pig
Trước hết, hãy tải xuống phiên bản mới nhất của Apache Pig từ trang web sau: https://pig.apache.org/
Bước 1
Mở trang chủ của trang web Apache Pig. Dưới phầnNews, Nhấp vào đường dẫn release page như thể hiện trong ảnh chụp nhanh sau đây.
Bước 2
Khi nhấp vào liên kết được chỉ định, bạn sẽ được chuyển hướng đến Apache Pig Releasestrang. Trên trang này, dướiDownload , bạn sẽ có hai liên kết, cụ thể là Pig 0.8 and later và Pig 0.7 and before. Nhấp vào đường dẫnPig 0.8 and later, sau đó bạn sẽ được chuyển hướng đến trang có một bộ gương.
Bước 3
Chọn và nhấp vào bất kỳ một trong những gương này như hình dưới đây.
Bước 4
Những tấm gương này sẽ đưa bạn đến Pig Releasestrang. Trang này chứa các phiên bản khác nhau của Apache Pig. Nhấp vào phiên bản mới nhất trong số đó.
Bước 5
Trong các thư mục này, bạn sẽ có các tệp nguồn và tệp nhị phân của Apache Pig trong các bản phân phối khác nhau. Tải xuống các tệp tar của nguồn và tệp nhị phân của Apache Pig 0.15,pig0.15.0-src.tar.gz và pig-0.15.0.tar.gz.
Cài đặt Apache Pig
Sau khi tải xuống phần mềm Apache Pig, hãy cài đặt nó trong môi trường Linux của bạn bằng cách làm theo các bước dưới đây.
Bước 1
Tạo một thư mục có tên Pig trong cùng một thư mục chứa các thư mục cài đặt của Hadoop, Java,và phần mềm khác đã được cài đặt. (Trong hướng dẫn của chúng tôi, chúng tôi đã tạo thư mục Pig trong người dùng có tên Hadoop).
$ mkdir Pig
Bước 2
Giải nén các tệp tar đã tải xuống như hình dưới đây.
$ cd Downloads/
$ tar zxvf pig-0.15.0-src.tar.gz $ tar zxvf pig-0.15.0.tar.gz
Bước 3
Di chuyển nội dung của pig-0.15.0-src.tar.gz nộp vào Pig thư mục đã tạo trước đó như hình dưới đây.
$ mv pig-0.15.0-src.tar.gz/* /home/Hadoop/Pig/
Định cấu hình Apache Pig
Sau khi cài đặt Apache Pig, chúng ta phải cấu hình nó. Để cấu hình, chúng tôi cần chỉnh sửa hai tệp -bashrc and pig.properties.
tệp .bashrc
bên trong .bashrc tập tin, đặt các biến sau:
PIG_HOME vào thư mục cài đặt của Apache Pig,
PATH biến môi trường vào thư mục bin và
PIG_CLASSPATH biến môi trường thành thư mục vv (cấu hình) của cài đặt Hadoop của bạn (thư mục chứa các tệp core-site.xml, hdfs-site.xml và mapred-site.xml).
export PIG_HOME = /home/Hadoop/Pig
export PATH = $PATH:/home/Hadoop/pig/bin
export PIG_CLASSPATH = $HADOOP_HOME/conf
tệp pig.properties
bên trong conf thư mục Pig, chúng tôi có một tệp tên pig.properties. Trong tệp pig.properties, bạn có thể đặt các thông số khác nhau như được cung cấp bên dưới.
pig -h properties
Các thuộc tính sau được hỗ trợ:
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.
Xác minh cài đặt
Xác minh cài đặt Apache Pig bằng cách gõ lệnh phiên bản. Nếu cài đặt thành công, bạn sẽ nhận được phiên bản Apache Pig như hình bên dưới.
$ pig –version
Apache Pig version 0.15.0 (r1682971)
compiled Jun 01 2015, 11:44:35
Trong chương trước, chúng tôi đã giải thích cách cài đặt Apache Pig. Trong chương này, chúng ta sẽ thảo luận về cách thực thi Apache Pig.
Chế độ thực thi Apache Pig
Bạn có thể chạy Apache Pig ở hai chế độ, cụ thể là Local Mode và HDFS mode.
Chế độ cục bộ
Trong chế độ này, tất cả các tệp được cài đặt và chạy từ máy chủ lưu trữ cục bộ và hệ thống tệp cục bộ của bạn. Không cần Hadoop hoặc HDFS. Chế độ này thường được sử dụng cho mục đích thử nghiệm.
Chế độ MapReduce
Chế độ MapReduce là nơi chúng tôi tải hoặc xử lý dữ liệu tồn tại trong Hệ thống tệp Hadoop (HDFS) bằng Apache Pig. Trong chế độ này, bất cứ khi nào chúng ta thực thi các câu lệnh Pig Latin để xử lý dữ liệu, một công việc MapReduce được gọi trong back-end để thực hiện một thao tác cụ thể trên dữ liệu tồn tại trong HDFS.
Cơ chế thực thi Apache Pig
Các tập lệnh Apache Pig có thể được thực thi theo ba cách, đó là chế độ tương tác, chế độ hàng loạt và chế độ nhúng.
Interactive Mode(Grunt shell) - Bạn có thể chạy Apache Pig ở chế độ tương tác bằng cách sử dụng Grunt shell. Trong trình bao này, bạn có thể nhập các câu lệnh Pig Latin và lấy kết quả (sử dụng toán tử Dump).
Batch Mode (Tập lệnh) - Bạn có thể chạy Apache Pig ở chế độ Batch bằng cách viết tập lệnh Pig Latin trong một tệp duy nhất với .pig sự mở rộng.
Embedded Mode (UDF) - Apache Pig cung cấp điều khoản xác định các chức năng của riêng chúng tôi (User Dtinh chế Fchú thích) bằng các ngôn ngữ lập trình như Java và sử dụng chúng trong tập lệnh của chúng tôi.
Gọi ra Grunt Shell
Bạn có thể gọi trình bao Grunt ở chế độ mong muốn (cục bộ / MapReduce) bằng cách sử dụng −x tùy chọn như hình dưới đây.
Chế độ cục bộ | Chế độ MapReduce |
---|---|
Command − $ ./pig –x cục bộ |
Command − $ ./pig -x mapreduce |
Output - |
Output - |
Một trong hai lệnh này cung cấp cho bạn lời nhắc trình bao Grunt như được hiển thị bên dưới.
grunt>
Bạn có thể thoát khỏi trình bao Grunt bằng cách sử dụng ‘ctrl + d’.
Sau khi gọi shell Grunt, bạn có thể thực thi tập lệnh Pig bằng cách nhập trực tiếp các câu lệnh Pig Latin vào đó.
grunt> customers = LOAD 'customers.txt' USING PigStorage(',');
Thực thi Apache Pig ở chế độ hàng loạt
Bạn có thể viết toàn bộ tập lệnh Pig Latin trong một tệp và thực thi nó bằng cách sử dụng –x command. Giả sử chúng tôi có tập lệnh Pig trong một tệp có tênsample_script.pig như hình bên dưới.
Sample_script.pig
student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING
PigStorage(',') as (id:int,name:chararray,city:chararray);
Dump student;
Bây giờ, bạn có thể thực thi tập lệnh trong tệp trên như hình dưới đây.
Chế độ cục bộ | Chế độ MapReduce |
---|---|
$ pig -x địa phương Sample_script.pig | $ pig -x mapreduce Sample_script.pig |
Note - Chúng ta sẽ thảo luận chi tiết về cách chạy tập lệnh Pig trong Bach mode và trong embedded mode trong các chương tiếp theo.
Sau khi gọi shell Grunt, bạn có thể chạy các tập lệnh Pig của mình trong shell. Ngoài ra, có một số lệnh hữu ích và tiện ích nhất định được cung cấp bởi shell Grunt. Chương này giải thích về shell và các lệnh tiện ích do Grunt shell cung cấp.
Note - Trong một số phần của chương này, các lệnh như Load và Stoređược sử dụng. Tham khảo các chương tương ứng để có thông tin chi tiết về chúng.
Lệnh Shell
Vỏ Grunt của Apache Pig chủ yếu được sử dụng để viết các chữ viết Latin của Pig. Trước đó, chúng ta có thể gọi bất kỳ lệnh shell nào bằng cách sử dụngsh và fs.
Lệnh sh
Sử dụng shlệnh, chúng ta có thể gọi bất kỳ lệnh shell nào từ Grunt shell. Sử dụngsh lệnh từ trình bao Grunt, chúng tôi không thể thực hiện các lệnh là một phần của môi trường trình bao (ex - cd).
Syntax
Dưới đây là cú pháp của sh chỉ huy.
grunt> sh shell command parameters
Example
Chúng ta có thể gọi ls lệnh của Linux shell từ Grunt shell bằng cách sử dụng shtùy chọn như hình dưới đây. Trong ví dụ này, nó liệt kê các tệp trong/pig/bin/ danh mục.
grunt> sh ls
pig
pig_1444799121955.log
pig.cmd
pig.py
Lệnh fs
Sử dụng fs , chúng ta có thể gọi bất kỳ lệnh FsShell nào từ trình bao Grunt.
Syntax
Dưới đây là cú pháp của fs chỉ huy.
grunt> sh File System command parameters
Example
Chúng ta có thể gọi lệnh ls của HDFS từ Grunt shell bằng lệnh fs. Trong ví dụ sau, nó liệt kê các tệp trong thư mục gốc 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
Theo cách tương tự, chúng ta có thể gọi tất cả các lệnh shell của hệ thống tệp khác từ Grunt shell bằng cách sử dụng fs chỉ huy.
Lệnh Tiện ích
Grunt shell cung cấp một tập hợp các lệnh tiện ích. Chúng bao gồm các lệnh tiện ích nhưclear, help, history, quit, và set; và các lệnh nhưexec, kill, và runđể điều khiển Pig khỏi vỏ Grunt. Dưới đây là mô tả về các lệnh tiện ích được cung cấp bởi Grunt shell.
lệnh rõ ràng
Các clear lệnh được sử dụng để xóa màn hình của Grunt shell.
Syntax
Bạn có thể xóa màn hình của vỏ grunt bằng cách sử dụng clear lệnh như hình dưới đây.
grunt> clear
trợ giúp Lệnh
Các help lệnh cung cấp cho bạn danh sách các lệnh Pig hoặc thuộc tính Pig.
Usage
Bạn có thể nhận danh sách các lệnh Pig bằng cách sử dụng help lệnh như hình dưới đây.
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.
lệnh lịch sử
Lệnh này hiển thị danh sách các câu lệnh được thực thi / sử dụng cho đến nay kể từ khi lệnh bán Grunt được gọi.
Usage
Giả sử chúng ta đã thực hiện ba câu lệnh kể từ khi mở Grunt shell.
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(',');
Sau đó, sử dụng history lệnh sẽ tạo ra kết quả sau.
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(',');
đặt lệnh
Các set lệnh được sử dụng để hiển thị / gán giá trị cho các khóa được sử dụng trong Pig.
Usage
Sử dụng lệnh này, bạn có thể đặt giá trị cho các khóa sau.
Chìa khóa | Mô tả và giá trị |
---|---|
default_parallel | Bạn có thể đặt số lượng bộ giảm bớt cho công việc bản đồ bằng cách chuyển bất kỳ số nguyên nào làm giá trị cho khóa này. |
debug | Bạn có thể tắt hoặc bật tính năng gỡ lỗi trong Pig bằng cách bật / tắt cho phím này. |
job.name | Bạn có thể đặt Tên công việc thành công việc được yêu cầu bằng cách chuyển một giá trị chuỗi vào khóa này. |
job.priority | Bạn có thể đặt mức độ ưu tiên công việc cho một công việc bằng cách chuyển một trong các giá trị sau vào khóa này:
|
stream.skippath | Để truyền trực tuyến, bạn có thể đặt đường dẫn từ nơi dữ liệu không được truyền, bằng cách chuyển đường dẫn mong muốn dưới dạng một chuỗi tới khóa này. |
bỏ Command
Bạn có thể thoát khỏi trình bao Grunt bằng lệnh này.
Usage
Thoát khỏi vỏ Grunt như hình dưới đây.
grunt> quit
Bây giờ chúng ta hãy xem các lệnh sử dụng mà bạn có thể điều khiển Apache Pig từ Grunt shell.
Lệnh thực thi
Sử dụng exec , chúng ta có thể thực thi các tập lệnh Pig từ shell Grunt.
Syntax
Dưới đây là cú pháp của lệnh tiện ích exec.
grunt> exec [–param param_name = param_value] [–param_file file_name] [script]
Example
Hãy giả sử rằng có một tệp có tên student.txt bên trong /pig_data/ thư mục của HDFS với nội dung sau.
Student.txt
001,Rajiv,Hyderabad
002,siddarth,Kolkata
003,Rajesh,Delhi
Và, giả sử chúng ta có một tệp kịch bản có tên sample_script.pig bên trong /pig_data/ thư mục của HDFS với nội dung sau.
Sample_script.pig
student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING PigStorage(',')
as (id:int,name:chararray,city:chararray);
Dump student;
Bây giờ, chúng ta hãy thực thi đoạn mã trên từ Grunt shell bằng cách sử dụng exec lệnh như hình dưới đây.
grunt> exec /sample_script.pig
Output
Các exec lệnh thực thi tập lệnh trong sample_script.pig. Theo chỉ dẫn trong kịch bản, nó tảistudent.txt vào Pig và cung cấp cho bạn kết quả của toán tử Dump hiển thị nội dung sau.
(1,Rajiv,Hyderabad)
(2,siddarth,Kolkata)
(3,Rajesh,Delhi)
lệnh giết
Bạn có thể giết một công việc từ trình bao Grunt bằng lệnh này.
Syntax
Dưới đây là cú pháp của kill chỉ huy.
grunt> kill JobId
Example
Giả sử có một công việc Pig đang chạy có id Id_0055, bạn có thể giết nó từ vỏ Grunt bằng cách sử dụng kill như hình dưới đây.
grunt> kill Id_0055
chạy lệnh
Bạn có thể chạy tập lệnh Pig từ trình bao Grunt bằng cách sử dụng run chỉ huy
Syntax
Dưới đây là cú pháp của run chỉ huy.
grunt> run [–param param_name = param_value] [–param_file file_name] script
Example
Hãy giả sử rằng có một tệp có tên student.txt bên trong /pig_data/ thư mục của HDFS với nội dung sau.
Student.txt
001,Rajiv,Hyderabad
002,siddarth,Kolkata
003,Rajesh,Delhi
Và, giả sử chúng ta có một tệp kịch bản có tên sample_script.pig trong hệ thống tệp cục bộ với nội dung sau.
Sample_script.pig
student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING
PigStorage(',') as (id:int,name:chararray,city:chararray);
Bây giờ, chúng ta hãy chạy đoạn script trên từ Grunt shell bằng lệnh run như hình dưới đây.
grunt> run /sample_script.pig
Bạn có thể xem đầu ra của tập lệnh bằng cách sử dụng Dump operator như hình bên dưới.
grunt> Dump;
(1,Rajiv,Hyderabad)
(2,siddarth,Kolkata)
(3,Rajesh,Delhi)
Note - Sự khác biệt giữa exec và run lệnh đó là nếu chúng ta sử dụng run, các câu lệnh từ tập lệnh có sẵn trong lịch sử lệnh.
Pig Latin là ngôn ngữ được sử dụng để phân tích dữ liệu trong Hadoop bằng Apache Pig. Trong chương này, chúng ta sẽ thảo luận về các khái niệm cơ bản của Pig Latin như câu lệnh Pig Latin, kiểu dữ liệu, toán tử quan hệ và tổng quát, và Pig Latin UDF.
Pig Latin - Mô hình dữ liệu
Như đã thảo luận trong các chương trước, mô hình dữ liệu của Pig được lồng hoàn toàn. ARelationlà cấu trúc ngoài cùng của mô hình dữ liệu Pig Latin. Và nó là mộtbag ở đâu -
- Một chiếc túi là một bộ sưu tập các bộ sưu tập.
- Một bộ là một tập hợp các trường có thứ tự.
- Trường là một phần dữ liệu.
Pig Latin - Statemets
Trong khi xử lý dữ liệu bằng Pig Latin, statements là những cấu trúc cơ bản.
Những câu lệnh này hoạt động với relations. Chúng bao gồmexpressions và schemas.
Mọi câu lệnh đều kết thúc bằng dấu chấm phẩy (;).
Chúng tôi sẽ thực hiện các hoạt động khác nhau bằng cách sử dụng các toán tử do Pig Latin cung cấp, thông qua các câu lệnh.
Ngoại trừ LOAD và STORE, trong khi thực hiện tất cả các hoạt động khác, các câu lệnh Pig Latin lấy một quan hệ làm đầu vào và tạo ra một quan hệ khác làm đầu ra.
Ngay sau khi bạn nhập một Loadtrong Grunt shell, việc kiểm tra ngữ nghĩa của nó sẽ được thực hiện. Để xem nội dung của lược đồ, bạn cần sử dụngDumpnhà điều hành. Chỉ sau khi thực hiệndump hoạt động, công việc MapReduce để tải dữ liệu vào hệ thống tệp sẽ được thực hiện.
Thí dụ
Dưới đây là câu lệnh Pig Latin tải dữ liệu vào Apache Pig.
grunt> Student_data = LOAD 'student_data.txt' USING PigStorage(',')as
( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );
Pig Latin - Kiểu dữ liệu
Bảng dưới đây mô tả các kiểu dữ liệu Pig Latin.
SN | Loại dữ liệu | Mô tả & Ví dụ |
---|---|---|
1 | int | Đại diện cho một số nguyên 32 bit có dấu. Example : số 8 |
2 | Dài | Đại diện cho một số nguyên 64 bit có dấu. Example : 5L |
3 | Phao nổi | Đại diện cho một dấu chấm động 32-bit có dấu. Example : 5,5F |
4 | gấp đôi | Đại diện cho một dấu chấm động 64 bit. Example : 10,5 |
5 | chararray | Đại diện cho một mảng ký tự (chuỗi) ở định dạng Unicode UTF-8. Example : 'điểm hướng dẫn' |
6 | Bytearray | Đại diện cho một mảng Byte (blob). |
7 | Boolean | Đại diện cho một giá trị Boolean. Example : đúng sai. |
số 8 | Ngày giờ | Đại diện cho ngày-giờ. Example : 1970-01-01T00: 00: 00.000 + 00: 00 |
9 | Biginteger | Đại diện cho một BigInteger Java. Example : 60708090709 |
10 | Bigdecimal | Đại diện cho một BigDecimal của Java Example : 185,98376256272893883 |
Loại phức tạp | ||
11 | Tuple | Một bộ là một tập hợp các trường có thứ tự. Example : (raja, 30 tuổi) |
12 | Túi | Một chiếc túi là một bộ sưu tập các bộ sưu tập. Example : {(raju, 30), (Mohhammad, 45)} |
13 | Bản đồ | Bản đồ là một tập hợp các cặp khóa-giá trị. Example : ['name' # 'Raju', 'age' # 30] |
Giá trị rỗng
Giá trị cho tất cả các kiểu dữ liệu trên có thể là NULL. Apache Pig xử lý các giá trị rỗng theo cách tương tự như SQL.
Giá trị null có thể là một giá trị không xác định hoặc một giá trị không tồn tại. Nó được sử dụng như một trình giữ chỗ cho các giá trị tùy chọn. Các giá trị null này có thể xảy ra tự nhiên hoặc có thể là kết quả của một hoạt động.
Pig Latin - Toán tử số học
Bảng sau đây mô tả các toán tử số học của Pig Latin. Giả sử a = 10 và b = 20.
Nhà điều hành | Sự miêu tả | Thí dụ |
---|---|---|
+ | Addition - Thêm các giá trị ở hai bên của toán tử |
a + b sẽ cho 30 |
- | Subtraction - Trừ toán hạng bên phải khỏi toán hạng bên trái |
a - b sẽ cho -10 |
* | Multiplication - Nhân các giá trị ở hai bên của toán tử |
a * b sẽ cho 200 |
/ | Division - Chia toán hạng bên trái cho toán hạng bên phải |
b / a sẽ cho 2 |
% | Modulus - Chia toán hạng bên trái cho toán hạng bên phải và trả về phần còn lại |
b% a sẽ cho 0 |
? : | Bincond- Đánh giá các toán tử Boolean. Nó có ba toán hạng như hình dưới đây. Biến đổi x = (biểu thức)? value1 nếu đúng :value2 nếu sai . |
b = (a == 1)? 20: 30; nếu a = 1 giá trị của b là 20. nếu a! = 1 giá trị của b là 30. |
TRƯỜNG HỢP KHI NÀO SAU ĐÓ ELSE KẾT THÚC |
Case - Toán tử case tương đương với toán tử bincond lồng nhau. |
TRƯỜNG HỢP f2% 2 KHI 0 THÌ 'chẵn' KHI 1 THÌ 'lẻ' KẾT THÚC |
Pig Latin - Toán tử so sánh
Bảng sau đây mô tả các toán tử so sánh của Pig Latin.
Nhà điều hành | Sự miêu tả | Thí dụ |
---|---|---|
== | Equal- Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không; nếu có, thì điều kiện trở thành đúng. |
(a = b) không đúng |
! = | Not Equal- Kiểm tra giá trị của hai toán hạng có bằng nhau hay không. Nếu các giá trị không bằng nhau, thì điều kiện trở thành true. |
(a! = b) là đúng. |
> | Greater than- Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không. Nếu có, thì điều kiện trở thành true. |
(a> b) không đúng. |
< | Less than- Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không. Nếu có, thì điều kiện trở thành true. |
(a <b) là đúng. |
> = | Greater than or equal to- Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không. Nếu có, thì điều kiện trở thành true. |
(a> = b) không đúng. |
<= | Less than or equal to- Kiểm tra xem giá trị của toán hạng bên trái nhỏ hơn hoặc bằng giá trị của toán hạng bên phải. Nếu có, thì điều kiện trở thành true. |
(a <= b) là đúng. |
diêm | Pattern matching - Kiểm tra xem chuỗi ở bên trái có khớp với hằng số ở bên phải hay không. |
f1 khớp với '. * hướng dẫn. *' |
Pig Latin - Nhà điều hành xây dựng kiểu
Bảng sau đây mô tả các toán tử xây dựng Kiểu của Pig Latin.
Nhà điều hành | Sự miêu tả | Thí dụ |
---|---|---|
() | Tuple constructor operator - Toán tử này được sử dụng để xây dựng một bộ giá trị. |
(Raju, 30 tuổi) |
{} | Bag constructor operator - Toán tử này được sử dụng để tạo túi. |
{(Raju, 30 tuổi), (Mohammad, 45 tuổi)} |
[] | Map constructor operator - Toán tử này được sử dụng để xây dựng một bộ giá trị. |
[tên # Raja, # 30 tuổi] |
Pig Latin - Phép toán quan hệ
Bảng sau đây mô tả các toán tử quan hệ của Pig Latin.
Nhà điều hành | Sự miêu tả |
---|---|
Loading and Storing | |
TẢI | Để tải dữ liệu từ hệ thống tệp (cục bộ / HDFS) vào một mối quan hệ. |
CỬA HÀNG | Để lưu một mối quan hệ với hệ thống tệp (cục bộ / HDFS). |
Lọc | |
BỘ LỌC | Để loại bỏ các hàng không mong muốn khỏi một quan hệ. |
DISTINCT | Để loại bỏ các hàng trùng lặp khỏi một mối quan hệ. |
FOREACH, GENERATE | Để tạo các phép biến đổi dữ liệu dựa trên các cột dữ liệu. |
SUỐI | Để chuyển đổi một quan hệ bằng cách sử dụng một chương trình bên ngoài. |
Nhóm và tham gia | |
THAM GIA | Để tham gia hai hoặc nhiều quan hệ. |
COGROUP | Để nhóm dữ liệu trong hai hoặc nhiều quan hệ. |
NHÓM | Để nhóm dữ liệu trong một mối quan hệ duy nhất. |
VƯỢT QUA | Để tạo ra sản phẩm chéo của hai hoặc nhiều quan hệ. |
Sắp xếp | |
ĐẶT HÀNG | Để sắp xếp một quan hệ theo thứ tự đã sắp xếp dựa trên một hoặc nhiều trường (tăng dần hoặc giảm dần). |
GIỚI HẠN | Để nhận một số bộ giá trị giới hạn từ một mối quan hệ. |
Kết hợp và tách | |
LIÊN HIỆP | Để kết hợp hai hoặc nhiều quan hệ thành một quan hệ duy nhất. |
TÁCH | Để tách một quan hệ thành hai hoặc nhiều quan hệ. |
Người điều hành chẩn đoán | |
DUMP | Để in nội dung của một quan hệ trên bảng điều khiển. |
DIỄN TẢ | Để mô tả lược đồ của một quan hệ. |
GIẢI THÍCH | Để xem các kế hoạch thực thi logic, vật lý hoặc MapReduce để tính toán một mối quan hệ. |
MINH HỌA | Để xem việc thực thi từng bước của một loạt các câu lệnh. |
Nói chung, Apache Pig hoạt động trên Hadoop. Nó là một công cụ phân tích phân tích các tập dữ liệu lớn tồn tại trongHbám vào File System. Để phân tích dữ liệu bằng Apache Pig, ban đầu chúng ta phải tải dữ liệu vào Apache Pig. Chương này giải thích cách tải dữ liệu vào Apache Pig từ HDFS.
Chuẩn bị HDFS
Trong chế độ MapReduce, Pig đọc (tải) dữ liệu từ HDFS và lưu trữ lại kết quả trong HDFS. Do đó, chúng ta hãy bắt đầu HDFS và tạo dữ liệu mẫu sau trong HDFS.
thẻ học sinh | Tên đầu tiên | Họ | Điện thoại | Tp. |
---|---|---|---|---|
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 |
Tập dữ liệu trên chứa các chi tiết cá nhân như id, tên, họ, số điện thoại và thành phố của sáu sinh viên.
Bước 1: Xác minh Hadoop
Trước hết, xác minh cài đặt bằng lệnh phiên bản Hadoop, như hình dưới đây.
$ hadoop version
Nếu hệ thống của bạn chứa Hadoop và nếu bạn đã đặt biến PATH, thì bạn sẽ nhận được kết quả sau:
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
Bước 2: Khởi động HDFS
Duyệt qua sbin thư mục của Hadoop và bắt đầu yarn và Hadoop dfs (hệ thống tệp phân tán) như hình dưới đây.
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
Bước 3: Tạo thư mục trong HDFS
Trong Hadoop DFS, bạn có thể tạo các thư mục bằng lệnh mkdir. Tạo một thư mục mới trong HDFS với tênPig_Data trong đường dẫn bắt buộc như hình dưới đây.
$cd /$Hadoop_Home/bin/
$ hdfs dfs -mkdir hdfs://localhost:9000/Pig_Data
Bước 4: Đặt dữ liệu vào HDFS
Tệp đầu vào của Pig chứa từng bộ / bản ghi trong các dòng riêng lẻ. Và các thực thể của bản ghi được phân tách bằng dấu phân cách (Trong ví dụ của chúng tôi, chúng tôi đã sử dụng“,”).
Trong hệ thống tệp cục bộ, hãy tạo một tệp đầu vào student_data.txt chứa dữ liệu như hình dưới đây.
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.
Bây giờ, hãy di chuyển tệp từ hệ thống tệp cục bộ sang HDFS bằng cách sử dụng putlệnh như hình dưới đây. (Bạn có thể dùngcopyFromLocal lệnh cũng vậy.)
$ cd $HADOOP_HOME/bin $ hdfs dfs -put /home/Hadoop/Pig/Pig_Data/student_data.txt dfs://localhost:9000/pig_data/
Xác minh tệp
Bạn có thể dùng cat để xác minh xem tệp đã được chuyển vào HDFS hay chưa, như được hiển thị bên dưới.
$ cd $HADOOP_HOME/bin
$ hdfs dfs -cat hdfs://localhost:9000/pig_data/student_data.txt
Đầu ra
Bạn có thể xem nội dung của tập tin như hình bên dưới.
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
Người điều hành tải
Bạn có thể tải dữ liệu vào Apache Pig từ hệ thống tệp (HDFS / Local) bằng cách sử dụng LOAD nhà điều hành của Pig Latin.
Cú pháp
Câu lệnh tải bao gồm hai phần được chia bởi toán tử “=”. Ở phía bên trái, chúng ta cần đề cập đến tên của mối quan hệwhere chúng ta muốn lưu trữ dữ liệu và ở phía bên phải, chúng ta phải xác định howchúng tôi lưu trữ dữ liệu. Dưới đây là cú pháp củaLoad nhà điều hành.
Relation_name = LOAD 'Input file path' USING function as schema;
Ở đâu,
relation_name - Chúng ta phải đề cập đến mối quan hệ mà chúng ta muốn lưu trữ dữ liệu.
Input file path- Chúng ta phải kể đến thư mục HDFS nơi lưu trữ tập tin. (Ở chế độ MapReduce)
function - Chúng ta phải chọn một hàm từ bộ hàm tải được cung cấp bởi Apache Pig (BinStorage, JsonLoader, PigStorage, TextLoader).
Schema- Chúng ta phải xác định lược đồ của dữ liệu. Chúng ta có thể xác định lược đồ bắt buộc như sau:
(column1 : data type, column2 : data type, column3 : data type);
Note- Chúng tôi tải dữ liệu mà không chỉ định lược đồ. Trong trường hợp đó, các cột sẽ được đánh địa chỉ là $ 01, $ 02, v.v.… (kiểm tra).
Thí dụ
Ví dụ, hãy để chúng tôi tải dữ liệu trong student_data.txt trong Pig dưới giản đồ có tên Student sử dụng LOAD chỉ huy.
Khởi động Pig Grunt Shell
Trước hết, hãy mở thiết bị đầu cuối Linux. Khởi động vỏ Pig Grunt ở chế độ MapReduce như hình dưới đây.
$ Pig –x mapreduce
Nó sẽ khởi động trình bao Pig Grunt như hình dưới đây.
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>
Thực hiện câu lệnh tải
Bây giờ tải dữ liệu từ tệp student_data.txt thành Pig bằng cách thực hiện câu lệnh Pig Latin sau đây trong Grunt shell.
grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt'
USING PigStorage(',')
as ( id:int, firstname:chararray, lastname:chararray, phone:chararray,
city:chararray );
Sau đây là mô tả của tuyên bố trên.
Tên quan hệ | Chúng tôi đã lưu trữ dữ liệu trong giản đồ student. | ||||||||||||
Đường dẫn tệp đầu vào | Chúng tôi đang đọc dữ liệu từ tệp student_data.txt, nằm trong thư mục / pig_data / của HDFS. | ||||||||||||
Chức năng lưu trữ | Chúng tôi đã sử dụng PigStorage()chức năng. Nó tải và lưu trữ dữ liệu dưới dạng tệp văn bản có cấu trúc. Nó sử dụng một dấu phân cách sử dụng mà mỗi thực thể của một bộ được phân tách, làm tham số. Theo mặc định, nó nhận '\ t' làm tham số. | ||||||||||||
lược đồ | Chúng tôi đã lưu trữ dữ liệu bằng lược đồ sau.
|
Note - Sự loadcâu lệnh sẽ chỉ cần tải dữ liệu vào quan hệ được chỉ định trong Pig. Để xác minh việc thực hiệnLoad tuyên bố, bạn phải sử dụng Diagnostic Operators sẽ được thảo luận trong các chương tiếp theo.
Trong chương trước, chúng ta đã học cách tải dữ liệu vào Apache Pig. Bạn có thể lưu trữ dữ liệu đã tải trong hệ thống tệp bằng cách sử dụngstorenhà điều hành. Chương này giải thích cách lưu trữ dữ liệu trong Apache Pig bằng cách sử dụngStore nhà điều hành.
Cú pháp
Dưới đây là cú pháp của câu lệnh Store.
STORE Relation_name INTO ' required_directory_path ' [USING function];
Thí dụ
Giả sử chúng tôi có một tệp student_data.txt trong HDFS với nội dung sau.
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.
Và chúng tôi đã đọc nó thành một mối quan hệ student bằng cách sử dụng toán tử LOAD như hình dưới đây.
grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt'
USING PigStorage(',')
as ( id:int, firstname:chararray, lastname:chararray, phone:chararray,
city:chararray );
Bây giờ, chúng ta hãy lưu trữ mối quan hệ trong thư mục HDFS “/pig_Output/” như hình bên dưới.
grunt> STORE student INTO ' hdfs://localhost:9000/pig_Output/ ' USING PigStorage (',');
Đầu ra
Sau khi thực hiện store, bạn sẽ nhận được kết quả sau. Một thư mục được tạo với tên được chỉ định và dữ liệu sẽ được lưu trữ trong đó.
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!
xác minh
Bạn có thể xác minh dữ liệu được lưu trữ như hình dưới đây.
Bước 1
Trước hết, liệt kê các tệp trong thư mục có tên pig_output sử dụng ls lệnh như hình dưới đây.
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
Bạn có thể thấy rằng hai tệp đã được tạo sau khi thực hiện store tuyên bố.
Bước 2
Sử dụng cat lệnh, liệt kê nội dung của tệp có tên part-m-00000 như hình bên dưới.
$ 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
Các loadcâu lệnh sẽ chỉ cần tải dữ liệu vào quan hệ được chỉ định trong Apache Pig. Để xác minh việc thực hiệnLoad tuyên bố, bạn phải sử dụng Diagnostic Operators. Pig Latin cung cấp bốn loại toán tử chẩn đoán khác nhau -
- Nhà điều hành bán phá giá
- Mô tả toán tử
- Toán tử giải thích
- Toán tử minh họa
Trong chương này, chúng ta sẽ thảo luận về các toán tử Dump của Pig Latin.
Nhà điều hành bán phá giá
Các Dumpđược sử dụng để chạy các câu lệnh Pig Latin và hiển thị kết quả trên màn hình. Nó thường được sử dụng để gỡ lỗi Mục đích.
Cú pháp
Dưới đây là cú pháp của Dump nhà điều hành.
grunt> Dump Relation_Name
Thí dụ
Giả sử chúng tôi có một tệp student_data.txt trong HDFS với nội dung sau.
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.
Và chúng tôi đã đọc nó thành một mối quan hệ student bằng cách sử dụng toán tử LOAD như hình dưới đây.
grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt'
USING PigStorage(',')
as ( id:int, firstname:chararray, lastname:chararray, phone:chararray,
city:chararray );
Bây giờ, chúng ta hãy in nội dung của quan hệ bằng cách sử dụng Dump operator như hình bên dưới.
grunt> Dump student
Khi bạn thực hiện những điều trên Pig Latin, nó sẽ bắt đầu công việc MapReduce để đọc dữ liệu từ HDFS. Nó sẽ tạo ra kết quả sau.
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)
Các describe toán tử được sử dụng để xem lược đồ của một quan hệ.
Cú pháp
Cú pháp của describe toán tử như sau:
grunt> Describe Relation_name
Thí dụ
Giả sử chúng tôi có một tệp student_data.txt trong HDFS với nội dung sau.
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.
Và chúng tôi đã đọc nó thành một mối quan hệ student bằng cách sử dụng toán tử LOAD như hình dưới đây.
grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' USING PigStorage(',')
as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );
Bây giờ, chúng ta hãy mô tả mối quan hệ có tên student và xác minh lược đồ như được hiển thị bên dưới.
grunt> describe student;
Đầu ra
Khi bạn thực hiện những điều trên Pig Latin , nó sẽ tạo ra kết quả sau.
grunt> student: { id: int,firstname: chararray,lastname: chararray,phone: chararray,city: chararray }
Các explain toán tử được sử dụng để hiển thị các kế hoạch thực thi logic, vật lý và MapReduce của một quan hệ.
Cú pháp
Dưới đây là cú pháp của explain nhà điều hành.
grunt> explain Relation_name;
Thí dụ
Giả sử chúng tôi có một tệp student_data.txt trong HDFS với nội dung sau.
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.
Và chúng tôi đã đọc nó thành một mối quan hệ student bằng cách sử dụng toán tử LOAD như hình dưới đây.
grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' USING PigStorage(',')
as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );
Bây giờ, hãy để chúng tôi giải thích mối quan hệ có tên sinh viên bằng cách sử dụng explain như hình dưới đây.
grunt> explain student;
Đầu ra
Nó sẽ tạo ra kết quả sau.
$ 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
----------------
Các illustrate toán tử cung cấp cho bạn việc thực thi từng bước một chuỗi các câu lệnh.
Cú pháp
Dưới đây là cú pháp của illustrate nhà điều hành.
grunt> illustrate Relation_name;
Thí dụ
Giả sử chúng tôi có một tệp student_data.txt trong HDFS với nội dung sau.
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.
Và chúng tôi đã đọc nó thành một mối quan hệ student bằng cách sử dụng toán tử LOAD như hình dưới đây.
grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt' USING PigStorage(',')
as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );
Bây giờ, chúng ta hãy minh họa quan hệ có tên sinh viên như hình dưới đây.
grunt> illustrate student;
Đầu ra
Khi thực hiện câu lệnh trên, bạn sẽ nhận được kết quả sau.
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 |
---------------------------------------------------------------------------------------------
Các GROUPtoán tử được sử dụng để nhóm dữ liệu trong một hoặc nhiều quan hệ. Nó thu thập dữ liệu có cùng một khóa.
Cú pháp
Dưới đây là cú pháp của group nhà điều hành.
grunt> Group_data = GROUP Relation_name BY age;
Thí dụ
Giả sử rằng chúng tôi có một tệp có tên student_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải tệp này vào Apache Pig với tên quan hệ student_details như hình bên dưới.
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);
Bây giờ, chúng ta hãy nhóm các bản ghi / bộ dữ liệu trong mối quan hệ theo độ tuổi như được hiển thị bên dưới.
grunt> group_data = GROUP student_details by age;
xác minh
Xác minh mối quan hệ group_data sử dụng DUMP như hình dưới đây.
grunt> Dump group_data;
Đầu ra
Sau đó, bạn sẽ nhận được đầu ra hiển thị nội dung của quan hệ có tên group_datanhư hình bên dưới. Ở đây bạn có thể thấy rằng lược đồ kết quả có hai cột:
Một là age, theo đó chúng tôi đã nhóm mối quan hệ.
Kia là một bag, trong đó chứa nhóm bộ giá trị, hồ sơ học sinh với độ tuổi tương ứng.
(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)})
Bạn có thể thấy lược đồ của bảng sau khi nhóm dữ liệu bằng cách sử dụng describe lệnh như hình dưới đây.
grunt> Describe group_data;
group_data: {group: int,student_details: {(id: int,firstname: chararray,
lastname: chararray,age: int,phone: chararray,city: chararray)}}
Theo cách tương tự, bạn có thể lấy minh họa mẫu của lược đồ bằng cách sử dụng illustrate lệnh như hình dưới đây.
$ Illustrate group_data;
Nó sẽ tạo ra kết quả sau:
-------------------------------------------------------------------------------------------------
|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)}|
-------------------------------------------------------------------------------------------------
Nhóm theo nhiều cột
Hãy để chúng tôi nhóm mối quan hệ theo độ tuổi và thành phố như hình dưới đây.
grunt> group_multiple = GROUP student_details by (age, city);
Bạn có thể xác minh nội dung của mối quan hệ có tên group_multiple sử dụng toán tử Dump như được hiển thị bên dưới.
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)})
Nhóm tất cả
Bạn có thể nhóm một quan hệ theo tất cả các cột như hình dưới đây.
grunt> group_all = GROUP student_details All;
Bây giờ, hãy xác minh nội dung của mối quan hệ group_all như hình bên dưới.
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)})
Các COGROUPtoán tử hoạt động nhiều hơn hoặc ít hơn theo cách giống như toán tử GROUP . Sự khác biệt duy nhất giữa hai toán tử làgroup toán tử thường được sử dụng với một quan hệ, trong khi cogroup toán tử được sử dụng trong các câu lệnh liên quan đến hai hoặc nhiều quan hệ.
Nhóm hai mối quan hệ bằng cách sử dụng Cogroup
Giả sử rằng chúng ta có hai tệp cụ thể là student_details.txt và employee_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải các tệp này vào Pig với các tên quan hệ student_details và employee_details tương ứng, như hình dưới đây.
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);
Bây giờ, chúng ta hãy nhóm các bản ghi / bộ giá trị của các mối quan hệ student_details và employee_details với độ tuổi quan trọng, như hình dưới đây.
grunt> cogroup_data = COGROUP student_details by age, employee_details by age;
xác minh
Xác minh mối quan hệ cogroup_data sử dụng DUMP như hình dưới đây.
grunt> Dump cogroup_data;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của quan hệ có tên cogroup_data như hình bên dưới.
(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)})
Các cogroup toán tử nhóm các bộ giá trị từ mỗi quan hệ theo độ tuổi trong đó mỗi nhóm mô tả một giá trị tuổi cụ thể.
Ví dụ: nếu chúng ta xem xét bộ đầu tiên của kết quả, nó được nhóm theo độ tuổi 21. Và nó chứa hai túi -
túi đầu tiên chứa tất cả các bộ giá trị từ quan hệ đầu tiên (student_details trong trường hợp này) có tuổi 21 và
túi thứ hai chứa tất cả các bộ giá trị từ quan hệ thứ hai (employee_details trong trường hợp này) có 21 tuổi.
Trong trường hợp một quan hệ không có bộ giá trị có giá trị tuổi là 21, nó trả về một túi trống.
Các JOINtoán tử được sử dụng để kết hợp các bản ghi từ hai hoặc nhiều quan hệ. Trong khi thực hiện thao tác nối, chúng ta khai báo một (hoặc một nhóm) (các) tuple từ mỗi quan hệ, dưới dạng các khóa. Khi các khóa này khớp nhau, hai bộ giá trị cụ thể được khớp với nhau, nếu không các bản ghi sẽ bị xóa. Tham gia có thể thuộc các loại sau:
- Self-join
- Inner-join
- Tham gia bên ngoài - tham gia trái, tham gia phải và tham gia đầy đủ
Chương này giải thích với các ví dụ về cách sử dụng toán tử nối trong Pig Latin. Giả sử rằng chúng ta có hai tệp cụ thể làcustomers.txt và orders.txt bên trong /pig_data/ thư mục của HDFS như hình dưới đây.
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
Và chúng tôi đã tải hai tệp này vào Pig với các quan hệ customers và orders như hình bên dưới.
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);
Bây giờ chúng ta hãy thực hiện các phép toán Tham gia khác nhau trên hai quan hệ này.
Tự tham gia
Self-join được sử dụng để nối một bảng với chính nó như thể bảng là hai quan hệ, tạm thời đổi tên ít nhất một quan hệ.
Nói chung, trong Apache Pig, để thực hiện tự nối, chúng tôi sẽ tải cùng một dữ liệu nhiều lần, dưới các bí danh (tên) khác nhau. Do đó, hãy để chúng tôi tải nội dung của tệpcustomers.txt như hai bảng như hình dưới đây.
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);
Cú pháp
Dưới đây là cú pháp thực hiện self-join hoạt động bằng cách sử dụng JOIN nhà điều hành.
grunt> Relation3_name = JOIN Relation1_name BY key, Relation2_name BY key ;
Thí dụ
Hãy để chúng tôi thực hiện self-join hoạt động trên mối quan hệ customers, bằng cách tham gia hai mối quan hệ customers1 và customers2 như hình bên dưới.
grunt> customers3 = JOIN customers1 BY id, customers2 BY id;
xác minh
Xác minh mối quan hệ customers3 sử dụng DUMP như hình dưới đây.
grunt> Dump customers3;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ 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)
Tham gia bên trong
Inner Joinđược sử dụng khá thường xuyên; nó cũng được gọi làequijoin. Một phép nối bên trong trả về các hàng khi có sự trùng khớp trong cả hai bảng.
Nó tạo ra một quan hệ mới bằng cách kết hợp các giá trị cột của hai quan hệ (ví dụ A và B) dựa trên vị từ nối. Truy vấn so sánh từng hàng của A với từng hàng của B để tìm tất cả các cặp hàng thỏa mãn vị từ nối. Khi vị từ nối được thỏa mãn, các giá trị cột cho mỗi cặp hàng A và B đã so khớp được kết hợp thành một hàng kết quả.
Cú pháp
Đây là cú pháp thực hiện inner join hoạt động bằng cách sử dụng JOIN nhà điều hành.
grunt> result = JOIN relation1 BY columnname, relation2 BY columnname;
Thí dụ
Hãy để chúng tôi thực hiện inner join hoạt động trên hai mối quan hệ customers và orders như hình bên dưới.
grunt> coustomer_orders = JOIN customers BY id, orders BY customer_id;
xác minh
Xác minh mối quan hệ coustomer_orders sử dụng DUMP như hình dưới đây.
grunt> Dump coustomer_orders;
Đầu ra
Bạn sẽ nhận được đầu ra sau đây sẽ là nội dung của mối quan hệ có tên 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 -
Tham gia bên ngoài : Không giống như tham gia bên trong,outer jointrả về tất cả các hàng từ ít nhất một trong các quan hệ. Hoạt động liên kết bên ngoài được thực hiện theo ba cách:
- Kết nối bên ngoài bên trái
- Tham gia bên ngoài bên phải
- Tham gia đầy đủ bên ngoài
Tham gia bên ngoài bên trái
Các left outer Join hoạt động trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có kết quả phù hợp nào trong quan hệ bên phải.
Cú pháp
Dưới đây là cú pháp thực hiện left outer join hoạt động bằng cách sử dụng JOIN nhà điều hành.
grunt> Relation3_name = JOIN Relation1_name BY id LEFT OUTER, Relation2_name BY customer_id;
Thí dụ
Chúng ta hãy thực hiện thao tác nối ngoài trái đối với hai quan hệ khách hàng và đơn hàng như hình bên dưới.
grunt> outer_left = JOIN customers BY id LEFT OUTER, orders BY customer_id;
xác minh
Xác minh mối quan hệ outer_left sử dụng DUMP như hình dưới đây.
grunt> Dump outer_left;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ 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,,,,)
Tham gia bên ngoài bên phải
Các right outer join hoạt động trả về tất cả các hàng từ bảng bên phải, ngay cả khi không có hàng nào phù hợp trong bảng bên trái.
Cú pháp
Dưới đây là cú pháp thực hiện right outer join hoạt động bằng cách sử dụng JOIN nhà điều hành.
grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;
Thí dụ
Hãy để chúng tôi thực hiện right outer join hoạt động trên hai mối quan hệ customers và orders như hình bên dưới.
grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;
xác minh
Xác minh mối quan hệ outer_right sử dụng DUMP như hình dưới đây.
grunt> Dump outer_right
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ 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)
Tham gia đầy đủ bên ngoài
Các full outer join hoạt động trả về các hàng khi có một kết quả phù hợp trong một trong các quan hệ.
Cú pháp
Dưới đây là cú pháp thực hiện full outer join sử dụng JOIN nhà điều hành.
grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;
Thí dụ
Hãy để chúng tôi thực hiện full outer join hoạt động trên hai mối quan hệ customers và orders như hình bên dưới.
grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;
xác minh
Xác minh mối quan hệ outer_full sử dụng DUMP như hình dưới đây.
grun> Dump outer_full;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ 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,,,,)
Sử dụng nhiều phím
Chúng ta có thể thực hiện thao tác JOIN bằng nhiều khóa.
Cú pháp
Đây là cách bạn có thể thực hiện thao tác JOIN trên hai bảng bằng nhiều khóa.
grunt> Relation3_name = JOIN Relation2_name BY (key1, key2), Relation3_name BY (key1, key2);
Giả sử rằng chúng ta có hai tệp cụ thể là employee.txt và employee_contact.txt bên trong /pig_data/ thư mục của HDFS như hình dưới đây.
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
Và chúng tôi đã tải hai tệp này vào Pig với các quan hệ employee và employee_contact như hình bên dưới.
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);
Bây giờ, chúng ta hãy tham gia nội dung của hai mối quan hệ này bằng cách sử dụng JOIN như hình dưới đây.
grunt> emp = JOIN employee BY (id,jobid), employee_contact BY (id,jobid);
xác minh
Xác minh mối quan hệ emp sử dụng DUMP như hình dưới đây.
grunt> Dump emp;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của quan hệ có tên emp như hình bên dưới.
(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)
Các CROSStoán tử tính toán tích chéo của hai hoặc nhiều quan hệ. Chương này giải thích ví dụ về cách sử dụng toán tử chéo trong Pig Latin.
Cú pháp
Dưới đây là cú pháp của CROSS nhà điều hành.
grunt> Relation3_name = CROSS Relation1_name, Relation2_name;
Thí dụ
Giả sử rằng chúng ta có hai tệp cụ thể là customers.txt và orders.txt bên trong /pig_data/ thư mục của HDFS như hình dưới đây.
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
Và chúng tôi đã tải hai tệp này vào Pig với các quan hệ customers và orders như hình bên dưới.
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);
Bây giờ chúng ta hãy lấy sản phẩm chéo của hai mối quan hệ này bằng cách sử dụng cross toán tử trên hai quan hệ này như hình dưới đây.
grunt> cross_data = CROSS customers, orders;
xác minh
Xác minh mối quan hệ cross_data sử dụng DUMP như hình dưới đây.
grunt> Dump cross_data;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ 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)
Các UNIONtoán tử Pig Latin được sử dụng để hợp nhất nội dung của hai quan hệ. Để thực hiện thao tác UNION trên hai quan hệ, các cột và miền của chúng phải giống nhau.
Cú pháp
Dưới đây là cú pháp của UNION nhà điều hành.
grunt> Relation_name3 = UNION Relation_name1, Relation_name2;
Thí dụ
Giả sử rằng chúng ta có hai tệp cụ thể là student_data1.txt và student_data2.txt bên trong /pig_data/ thư mục của HDFS như hình dưới đây.
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.
Và chúng tôi đã tải hai tệp này vào Pig với các quan hệ student1 và student2 như hình bên dưới.
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);
Bây giờ chúng ta hãy hợp nhất nội dung của hai mối quan hệ này bằng cách sử dụng UNION như hình dưới đây.
grunt> student = UNION student1, student2;
xác minh
Xác minh mối quan hệ student sử dụng DUMP như hình dưới đây.
grunt> Dump student;
Đầu ra
Nó sẽ hiển thị đầu ra sau, hiển thị nội dung của mối quan hệ 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)
Các SPLIT toán tử được sử dụng để tách một quan hệ thành hai hoặc nhiều quan hệ.
Cú pháp
Dưới đây là cú pháp của SPLIT nhà điều hành.
grunt> SPLIT Relation1_name INTO Relation2_name IF (condition1), Relation2_name (condition2),
Thí dụ
Giả sử rằng chúng tôi có một tệp có tên student_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải tệp này vào Pig với tên quan hệ student_details như hình bên dưới.
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);
Bây giờ chúng ta hãy chia mối quan hệ này thành hai, một liệt kê những nhân viên dưới 23 tuổi và một liệt kê những nhân viên có độ tuổi từ 22 đến 25.
SPLIT student_details into student_details1 if age<23, student_details2 if (22<age and age>25);
xác minh
Xác minh các mối quan hệ student_details1 và student_details2 sử dụng DUMP như hình dưới đây.
grunt> Dump student_details1;
grunt> Dump student_details2;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của các quan hệ student_details1 và student_details2 tương ứng.
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)
Các FILTER toán tử được sử dụng để chọn các bộ giá trị cần thiết từ một quan hệ dựa trên một điều kiện.
Cú pháp
Dưới đây là cú pháp của FILTER nhà điều hành.
grunt> Relation2_name = FILTER Relation1_name BY (condition);
Thí dụ
Giả sử rằng chúng tôi có một tệp có tên student_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải tệp này vào Pig với tên quan hệ student_details như hình bên dưới.
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);
Bây giờ chúng ta hãy sử dụng toán tử Bộ lọc để có được thông tin chi tiết của các sinh viên thuộc thành phố Chennai.
filter_data = FILTER student_details BY city == 'Chennai';
xác minh
Xác minh mối quan hệ filter_data sử dụng DUMP như hình dưới đây.
grunt> Dump filter_data;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ filter_data như sau.
(6,Archana,Mishra,23,9848022335,Chennai)
(8,Bharathi,Nambiayar,24,9848022333,Chennai)
Các DISTINCT toán tử được sử dụng để loại bỏ các bộ giá trị thừa (trùng lặp) khỏi một quan hệ.
Cú pháp
Dưới đây là cú pháp của DISTINCT nhà điều hành.
grunt> Relation_name2 = DISTINCT Relatin_name1;
Thí dụ
Giả sử rằng chúng tôi có một tệp có tên student_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải tệp này vào Pig với tên quan hệ student_details như hình bên dưới.
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);
Bây giờ chúng ta hãy xóa các bộ giá trị thừa (trùng lặp) khỏi quan hệ có tên student_details sử dụng DISTINCT toán tử và lưu trữ nó dưới dạng một quan hệ khác có tên distinct_data như hình bên dưới.
grunt> distinct_data = DISTINCT student_details;
xác minh
Xác minh mối quan hệ distinct_data sử dụng DUMP như hình dưới đây.
grunt> Dump distinct_data;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ distinct_data như sau.
(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)
Các FOREACH được sử dụng để tạo các phép biến đổi dữ liệu được chỉ định dựa trên dữ liệu cột.
Cú pháp
Dưới đây là cú pháp của FOREACH nhà điều hành.
grunt> Relation_name2 = FOREACH Relatin_name1 GENERATE (required data);
Thí dụ
Giả sử rằng chúng tôi có một tệp có tên student_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải tệp này vào Pig với tên quan hệ student_details như hình bên dưới.
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);
Bây giờ chúng ta hãy lấy giá trị id, tuổi và thành phố của mỗi học sinh từ mối quan hệ student_details và lưu trữ nó vào một quan hệ khác có tên foreach_data sử dụng foreach như hình dưới đây.
grunt> foreach_data = FOREACH student_details GENERATE id,age,city;
xác minh
Xác minh mối quan hệ foreach_data sử dụng DUMP như hình dưới đây.
grunt> Dump foreach_data;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ 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)
Các ORDER BY toán tử được sử dụng để hiển thị nội dung của một quan hệ theo thứ tự được sắp xếp dựa trên một hoặc nhiều trường.
Cú pháp
Dưới đây là cú pháp của ORDER BY nhà điều hành.
grunt> Relation_name2 = ORDER Relatin_name1 BY (ASC|DESC);
Thí dụ
Giả sử rằng chúng tôi có một tệp có tên student_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải tệp này vào Pig với tên quan hệ student_details như hình bên dưới.
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);
Bây giờ chúng ta hãy sắp xếp mối quan hệ theo thứ tự giảm dần dựa trên tuổi của học sinh và lưu trữ nó vào một mối quan hệ khác có tên order_by_data sử dụng ORDER BY như hình dưới đây.
grunt> order_by_data = ORDER student_details BY age DESC;
xác minh
Xác minh mối quan hệ order_by_data sử dụng DUMP như hình dưới đây.
grunt> Dump order_by_data;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ 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)
Các LIMIT toán tử được sử dụng để lấy một số bộ giá trị giới hạn từ một quan hệ.
Cú pháp
Dưới đây là cú pháp của LIMIT nhà điều hành.
grunt> Result = LIMIT Relation_name required number of tuples;
Thí dụ
Giả sử rằng chúng tôi có một tệp có tên student_details.txt trong thư mục HDFS /pig_data/ như hình bên dưới.
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
Và chúng tôi đã tải tệp này vào Pig với tên quan hệ student_details như hình bên dưới.
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);
Bây giờ, hãy sắp xếp mối quan hệ theo thứ tự giảm dần dựa trên độ tuổi của học sinh và lưu trữ nó vào một mối quan hệ khác có tên limit_data sử dụng ORDER BY như hình dưới đây.
grunt> limit_data = LIMIT student_details 4;
xác minh
Xác minh mối quan hệ limit_data sử dụng DUMP như hình dưới đây.
grunt> Dump limit_data;
Đầu ra
Nó sẽ tạo ra kết quả sau, hiển thị nội dung của mối quan hệ limit_data như sau.
(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 cung cấp nhiều chức năng cài sẵn khác nhau, cụ thể là eval, load, store, math, string, bag và tuple chức năng.
Đánh giá chức năng
Dưới đây là danh sách eval các chức năng do Apache Pig cung cấp.
SN | Mô tả chức năng |
---|---|
1 | AVG () Để tính giá trị trung bình của các giá trị số trong một túi. |
2 | BagToString () Để nối các phần tử của một túi thành một chuỗi. Trong khi nối, chúng ta có thể đặt dấu phân cách giữa các giá trị này (tùy chọn). |
3 | CONCAT () Để nối hai hoặc nhiều biểu thức cùng kiểu. |
4 | ĐẾM() Để lấy số phần tử trong một túi, đồng thời đếm số phần tử trong một túi. |
5 | COUNT_STAR () Nó tương tự như COUNT()chức năng. Nó được sử dụng để lấy số phần tử trong một túi. |
6 | DIFF () Để so sánh hai túi (trường) trong một bộ. |
7 | IsEmpty () Để kiểm tra xem túi hoặc bản đồ có trống không. |
số 8 | MAX () Để tính giá trị cao nhất cho một cột (giá trị số hoặc ký tự) trong túi một cột. |
9 | MIN () Để nhận giá trị nhỏ nhất (thấp nhất) (số hoặc ký tự) cho một cột nhất định trong túi một cột. |
10 | PluckTuple () Sử dụng tiếng Latin Pig PluckTuple() chức năng, chúng ta có thể xác định một Tiền tố chuỗi và lọc các cột trong một mối quan hệ bắt đầu bằng tiền tố đã cho. |
11 | KÍCH THƯỚC() Để tính toán số lượng phần tử dựa trên bất kỳ kiểu dữ liệu Pig nào. |
12 | SUBTRACT () Để trừ hai túi. Nó lấy hai túi làm đầu vào và trả lại một túi có chứa các bộ của túi thứ nhất mà không có trong túi thứ hai. |
13 | TỔNG() Để nhận tổng các giá trị số của một cột trong một túi một cột. |
14 | TOKENIZE () Để tách một chuỗi (chứa một nhóm từ) trong một bộ dữ liệu duy nhất và trả về một túi chứa đầu ra của hoạt động tách. |
Các Load và Storecác hàm trong Apache Pig được sử dụng để xác định cách dữ liệu đưa quảng cáo ra khỏi Pig. Các chức năng này được sử dụng với các nhà khai thác tải và lưu trữ. Dưới đây là danh sách các chức năng tải và lưu trữ có sẵn trong Pig.
SN | Mô tả chức năng |
---|---|
1 | PigStorage () Để tải và lưu trữ các tệp có cấu trúc. |
2 | TextLoader () Để tải dữ liệu phi cấu trúc vào Pig. |
3 | BinStorage () Để tải và lưu trữ dữ liệu vào Pig bằng định dạng máy có thể đọc được. |
4 | Xử lý nén Trong Pig Latin, chúng ta có thể tải và lưu trữ dữ liệu nén. |
Dưới đây là danh sách các hàm Bag và Tuple.
SN | Mô tả chức năng |
---|---|
1 | BỎ VÀO TÚI() Để chuyển hai hoặc nhiều biểu thức thành một túi. |
2 | HÀNG ĐẦU() Để lên đỉnh N bộ giá trị của một mối quan hệ. |
3 | TOTUPLE () Để chuyển đổi một hoặc nhiều biểu thức thành một bộ giá trị. |
4 | TOMAP () Để chuyển đổi các cặp khóa-giá trị thành Bản đồ. |
Chúng ta có các hàm Chuỗi sau trong Apache Pig.
SN | Chức năng & Mô tả |
---|---|
1 | ENDSWITH (chuỗi, testAgainst) Để xác minh xem một chuỗi đã cho có kết thúc bằng một chuỗi con cụ thể hay không. |
2 | STARTSWITH (chuỗi, chuỗi con) Chấp nhận hai tham số chuỗi và xác minh xem chuỗi đầu tiên có bắt đầu bằng chuỗi thứ hai hay không. |
3 | SUBSTRING (chuỗi, startIndex, stopIndex) Trả về một chuỗi con từ một chuỗi đã cho. |
4 | EqualsIgnoreCase (string1, string2) Để so sánh hai vết đốt bỏ qua trường hợp. |
5 | INDEXOF (chuỗi, 'ký tự', startIndex) Trả về lần xuất hiện đầu tiên của một ký tự trong một chuỗi, tìm kiếm từ chỉ mục bắt đầu. |
6 | LAST_INDEX_OF (biểu thức) Trả về chỉ mục của lần xuất hiện cuối cùng của một ký tự trong một chuỗi, tìm kiếm ngược từ chỉ mục bắt đầu. |
7 | LCFIRST (biểu thức) Chuyển đổi ký tự đầu tiên trong một chuỗi thành chữ thường. |
số 8 | UCFIRST (biểu thức) Trả về một chuỗi có ký tự đầu tiên được chuyển đổi thành chữ hoa. |
9 | UPPER (biểu thức) UPPER (biểu thức) Trả về một chuỗi được chuyển đổi thành chữ hoa. |
10 | LOWER (biểu thức) Chuyển đổi tất cả các ký tự trong một chuỗi thành chữ thường. |
11 | REPLACE (string, 'oldChar', 'newChar'); Để thay thế các ký tự hiện có trong một chuỗi bằng các ký tự mới. |
12 | STRSPLIT (chuỗi, regex, giới hạn) Để chia một chuỗi xung quanh các kết quả phù hợp của một biểu thức chính quy đã cho. |
13 | STRSPLITTOBAG (chuỗi, regex, giới hạn) Tương tự như STRSPLIT() hàm, nó tách chuỗi bằng dấu phân cách đã cho và trả về kết quả trong một túi. |
14 | TRIM (biểu thức) Trả về bản sao của một chuỗi đã loại bỏ khoảng trắng ở đầu và cuối. |
15 | LTRIM (biểu thức) Trả về bản sao của một chuỗi đã xóa các khoảng trắng ở đầu. |
16 | RTRIM (biểu thức) Trả về bản sao của một chuỗi đã xóa các khoảng trắng ở cuối. |
Apache Pig cung cấp các hàm Ngày và Giờ sau:
SN | Chức năng & Mô tả |
---|---|
1 | Ngày đến (mili giây) Hàm này trả về một đối tượng ngày-giờ theo các tham số đã cho. Các thay thế khác cho chức năng này là ToDate (iosstring), ToDate (userstring, format), ToDate (userstring, format, timezone) |
2 | Thời điểm hiện tại() trả về đối tượng ngày-giờ của thời gian hiện tại. |
3 | GetDay (ngày giờ) Trả về ngày trong tháng từ đối tượng ngày-giờ. |
4 | GetHour (ngày giờ) Trả về giờ trong ngày từ đối tượng ngày-giờ. |
5 | GetMilliSecond (ngày giờ) Trả về phần nghìn giây của giây từ đối tượng ngày-giờ. |
6 | GetMinute (ngày giờ) Trả về phút của một giờ từ đối tượng ngày-giờ. |
7 | GetMonth (ngày giờ) Trả về tháng trong năm từ đối tượng ngày-giờ. |
số 8 | GetSecond (ngày giờ) Trả về giây của phút từ đối tượng ngày-giờ. |
9 | GetWeek (ngày giờ) Trả về tuần trong năm từ đối tượng ngày-giờ. |
10 | GetWeekYear (ngày giờ) Trả về năm tuần từ đối tượng ngày-giờ. |
11 | GetYear (ngày giờ) Trả về năm từ đối tượng ngày-giờ. |
12 | AddDuration (ngày giờ, thời lượng) Trả về kết quả của một đối tượng ngày-giờ cùng với đối tượng thời lượng. |
13 | SubtractDuration (ngày giờ, thời lượng) Trừ đối tượng Duration khỏi đối tượng Date-Time và trả về kết quả. |
14 | DaysBetween (datetime1, datetime2) Trả về số ngày giữa hai đối tượng ngày-giờ. |
15 | Giờ giữa (datetime1, datetime2) Trả về số giờ giữa hai đối tượng ngày-giờ. |
16 | MilliSecondsBetween (datetime1, datetime2) Trả về số mili giây giữa hai đối tượng ngày-giờ. |
17 | Phút giữa (datetime1, datetime2) Trả về số phút giữa hai đối tượng ngày-giờ. |
18 | Tháng giữa (datetime1, datetime2) Trả về số tháng giữa hai đối tượng ngày-giờ. |
19 | Giây giữa (datetime1, datetime2) Trả về số giây giữa hai đối tượng ngày-giờ. |
20 | Tuần giữa (datetime1, datetime2) Trả về số tuần giữa hai đối tượng ngày-giờ. |
21 | Năm giữa (datetime1, datetime2) Trả về số năm giữa hai đối tượng ngày-giờ. |
Chúng tôi có các hàm Toán học sau trong Apache Pig -
SN | Chức năng & Mô tả |
---|---|
1 | ABS (biểu thức) Để nhận giá trị tuyệt đối của một biểu thức. |
2 | ACOS (biểu thức) Để có được cosin cung của một biểu thức. |
3 | ASIN (biểu thức) Để có được cung sin của một biểu thức. |
4 | ATAN (biểu thức) Hàm này được sử dụng để lấy tiếp tuyến cung của một biểu thức. |
5 | CBRT (biểu thức) Hàm này được sử dụng để lấy gốc khối của một biểu thức. |
6 | CEIL (biểu thức) Hàm này được sử dụng để lấy giá trị của một biểu thức được làm tròn đến số nguyên gần nhất. |
7 | COS (biểu thức) Hàm này được sử dụng để lấy cosin lượng giác của một biểu thức. |
số 8 | COSH (biểu thức) Hàm này được sử dụng để lấy cosin hyperbol của một biểu thức. |
9 | EXP (biểu thức) Hàm này được sử dụng để nâng số e của Euler lên lũy thừa của x. |
10 | FLOOR (biểu thức) Để nhận giá trị của một biểu thức được làm tròn xuống số nguyên gần nhất. |
11 | LOG (biểu thức) Để lấy lôgarit tự nhiên (cơ số e) của một biểu thức. |
12 | LOG10 (biểu thức) Để lấy logarit cơ số 10 của một biểu thức. |
13 | NGẪU NHIÊN () Để nhận một số ngẫu nhiên giả (loại double) lớn hơn hoặc bằng 0,0 và nhỏ hơn 1,0. |
14 | ROUND (biểu thức) Để nhận giá trị của biểu thức được làm tròn thành số nguyên (nếu kiểu kết quả là float) hoặc làm tròn thành dài (nếu kiểu kết quả là double). |
15 | SIN (biểu thức) Để lấy sin của một biểu thức. |
16 | SINH (biểu thức) Để nhận được sin hyperbol của một biểu thức. |
17 | SQRT (biểu thức) Để nhận căn bậc hai dương của một biểu thức. |
18 | TAN (biểu thức) Để nhận được tiếp tuyến lượng giác của một góc. |
19 | TANH (biểu thức) Để nhận được tiếp tuyến hypebol của một biểu thức. |
Ngoài các chức năng tích hợp, Apache Pig cung cấp hỗ trợ rộng rãi cho User Dtinh chế Fchú thích (UDF's). Sử dụng các UDF này, chúng ta có thể xác định các chức năng của riêng mình và sử dụng chúng. Hỗ trợ UDF được cung cấp bằng sáu ngôn ngữ lập trình, đó là Java, Jython, Python, JavaScript, Ruby và Groovy.
Để viết UDF, hỗ trợ hoàn chỉnh được cung cấp bằng Java và hỗ trợ hạn chế được cung cấp cho tất cả các ngôn ngữ còn lại. Sử dụng Java, bạn có thể viết UDF liên quan đến tất cả các phần của quá trình xử lý như tải / lưu trữ dữ liệu, chuyển đổi cột và tổng hợp. Vì Apache Pig được viết bằng Java, nên UDF được viết bằng ngôn ngữ Java hoạt động hiệu quả so với các ngôn ngữ khác.
Trong Apache Pig, chúng tôi cũng có một kho lưu trữ Java cho UDF có tên Piggybank. Sử dụng Piggybank, chúng tôi có thể truy cập vào Java UDF do người dùng khác viết và đóng góp UDF của riêng chúng tôi.
Các loại UDF trong Java
Trong khi viết UDF bằng Java, chúng ta có thể tạo và sử dụng ba loại hàm sau:
Filter Functions- Các chức năng bộ lọc được sử dụng làm điều kiện trong các câu lệnh bộ lọc. Các hàm này chấp nhận giá trị Pig làm đầu vào và trả về giá trị Boolean.
Eval Functions- Các hàm Eval được sử dụng trong các câu lệnh FOREACH-GENERATE. Các hàm này chấp nhận giá trị Pig làm đầu vào và trả về kết quả Pig.
Algebraic Functions- Các hàm Đại số hoạt động trên các túi bên trong trong một câu lệnh FOREACHGENERATE. Các chức năng này được sử dụng để thực hiện các hoạt động MapReduce đầy đủ trên một túi bên trong.
Viết UDF bằng Java
Để viết một UDF bằng Java, chúng ta phải tích hợp tệp jar Pig-0.15.0.jar. Trong phần này, chúng ta thảo luận về cách viết một UDF mẫu bằng Eclipse. Trước khi tiếp tục, hãy đảm bảo rằng bạn đã cài đặt Eclipse và Maven trong hệ thống của mình.
Làm theo các bước dưới đây để viết một hàm UDF -
Mở Eclipse và tạo một dự án mới (giả sử myproject).
Chuyển dự án mới tạo thành dự án Maven.
Sao chép nội dung sau trong pom.xml. Tệp này chứa các phụ thuộc Maven cho các tệp jar Apache Pig và 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>
Lưu tệp và làm mới nó. bên trongMaven Dependencies , bạn có thể tìm thấy các tệp jar đã tải xuống.
Tạo một tệp lớp mới với tên Sample_Eval và sao chép nội dung sau vào đó.
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();
}
}
Trong khi viết UDF, bắt buộc phải kế thừa lớp EvalFunc và cung cấp triển khai exec()chức năng. Trong chức năng này, mã cần thiết cho UDF được viết. Trong ví dụ trên, chúng tôi đã trả về mã để chuyển đổi nội dung của cột đã cho thành chữ hoa.
Sau khi biên dịch lớp mà không có lỗi, nhấp chuột phải vào tệp Sample_Eval.java. Nó cung cấp cho bạn một menu. Lựa chọnexport như thể hiện trong ảnh chụp màn hình sau.
Khi nhấp vào export, bạn sẽ nhận được cửa sổ sau. Bấm vàoJAR file.
Tiếp tục bằng cách nhấp vào Next>cái nút. Bạn sẽ nhận được một cửa sổ khác, nơi bạn cần nhập đường dẫn trong hệ thống tệp cục bộ, nơi bạn cần lưu trữ tệp jar.
Cuối cùng nhấp vào Finishcái nút. Trong thư mục được chỉ định, một tệp Jarsample_udf.jarđược tạo ra. Tệp jar này chứa UDF được viết bằng Java.
Sử dụng UDF
Sau khi ghi UDF và tạo tệp Jar, hãy làm theo các bước dưới đây:
Bước 1: Đăng ký tệp Jar
Sau khi viết UDF (bằng Java), chúng ta phải đăng ký tệp Jar có chứa UDF bằng toán tử Đăng ký. Bằng cách đăng ký tệp Jar, người dùng có thể xác định vị trí của UDF thành Apache Pig.
Syntax
Dưới đây là cú pháp của nhà điều hành Đăng ký.
REGISTER path;
Example
Để làm ví dụ, chúng ta hãy đăng ký sample_udf.jar đã được tạo trước đó trong chương này.
Khởi động Apache Pig ở chế độ cục bộ và đăng ký tệp jar sample_udf.jar như hình dưới đây.
$cd PIG_HOME/bin $./pig –x local
REGISTER '/$PIG_HOME/sample_udf.jar'
Note - giả sử tệp Jar trong đường dẫn - /$PIG_HOME/sample_udf.jar
Bước 2: Xác định bí danh
Sau khi đăng ký UDF, chúng ta có thể xác định bí danh cho nó bằng cách sử dụng Define nhà điều hành.
Syntax
Dưới đây là cú pháp của toán tử Xác định.
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
Example
Xác định bí danh cho sample_eval như hình dưới đây.
DEFINE sample_eval sample_eval();
Bước 3: Sử dụng UDF
Sau khi xác định bí danh, bạn có thể sử dụng UDF giống như các chức năng tích hợp sẵn. Giả sử có một tệp có tên emp_data trong HDFS/Pig_Data/ thư mục với nội dung sau.
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
Và giả sử chúng ta đã tải tệp này vào Pig như hình bên dưới.
grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, city:chararray);
Bây giờ chúng ta hãy chuyển đổi tên của các nhân viên thành chữ hoa bằng cách sử dụng UDF sample_eval.
grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);
Xác minh nội dung của mối quan hệ Upper_case như hình bên dưới.
grunt> Dump Upper_case;
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)
Ở đây trong chương này, chúng ta sẽ xem cách chạy các tập lệnh Apache Pig ở chế độ hàng loạt.
Nhận xét trong Tập lệnh lợn
Trong khi viết script trong một tệp, chúng ta có thể đưa vào các chú thích trong đó như hình dưới đây.
Nhận xét nhiều dòng
Chúng tôi sẽ bắt đầu các nhận xét nhiều dòng bằng '/ *', kết thúc chúng bằng '* /'.
/* These are the multi-line comments
In the pig script */
Nhận xét một dòng
Chúng tôi sẽ bắt đầu nhận xét một dòng bằng '-'.
--we can write single line comments like this.
Thực thi tập lệnh lợn ở chế độ hàng loạt
Trong khi thực hiện các câu lệnh Apache Pig ở chế độ hàng loạt, hãy làm theo các bước dưới đây.
Bước 1
Viết tất cả các câu lệnh Pig Latin cần thiết trong một tệp duy nhất. Chúng tôi có thể viết tất cả các câu lệnh và câu lệnh Pig Latin trong một tệp duy nhất và lưu nó dưới dạng.pig tập tin.
Bước 2
Thực thi tập lệnh Apache Pig. Bạn có thể thực thi tập lệnh Pig từ shell (Linux) như hình dưới đây.
Chế độ cục bộ | Chế độ MapReduce |
---|---|
$ pig -x địa phương Sample_script.pig | $ pig -x mapreduce Sample_script.pig |
Bạn có thể thực thi nó từ Grunt shell cũng như sử dụng lệnh execute như hình dưới đây.
grunt> exec /sample_script.pig
Thực thi tập lệnh lợn từ HDFS
Chúng tôi cũng có thể thực thi một tập lệnh Pig nằm trong HDFS. Giả sử có một tập lệnh Pig với tênSample_script.pig trong thư mục HDFS có tên /pig_data/. Chúng ta có thể thực hiện nó như hình dưới đây.
$ pig -x mapreduce hdfs://localhost:9000/pig_data/Sample_script.pig
Thí dụ
Giả sử chúng tôi có một tệp student_details.txt trong HDFS với nội dung sau.
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
Chúng tôi cũng có một kịch bản mẫu với tên sample_script.pig, trong cùng một thư mục HDFS. Tệp này chứa các câu lệnh thực hiện các phép toán và phép biến đổi trênstudent quan hệ, như được hiển thị bên dưới.
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;
Câu lệnh đầu tiên của tập lệnh sẽ tải dữ liệu trong tệp có tên student_details.txt như một mối quan hệ có tên student.
Câu lệnh thứ hai của tập lệnh sẽ sắp xếp các bộ giá trị của mối quan hệ theo thứ tự giảm dần, dựa trên độ tuổi và lưu trữ nó dưới dạng student_order.
Câu lệnh thứ ba của tập lệnh sẽ lưu trữ 4 bộ giá trị đầu tiên của student_order như student_limit.
Cuối cùng câu lệnh thứ tư sẽ kết xuất nội dung của mối quan hệ student_limit.
Bây giờ hãy để chúng tôi thực hiện sample_script.pig như hình bên dưới.
$./pig -x mapreduce hdfs://localhost:9000/pig_data/sample_script.pig
Apache Pig được thực thi và cung cấp cho bạn kết quả với nội dung sau.
(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)