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.txtorders.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ệ customersorders 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ệ customers1customers2 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ệ customersorders 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ệ customersorders 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ệ customersorders 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.txtemployee_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ệ employeeemployee_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)