Apache Pig - Tham gia nhà điều hành
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 với nhau, hai bộ giá trị cụ thể được khớp với nhau, các bản ghi khác 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 bên 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 thao tác Nối 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)