Data Analysis với Pig Latin Programming
PigLatin
1
White

Vu Nhat Minh viết ngày 31/08/2016

Data Analysis và Pig Latin

Nếu bạn đã từng làm việc với DB, chắc hẳn đã nghe đến HadoopMap-Reduce.

Map-Reduce, hay NoSQL style là một phương pháp tiếp cận hiệu quả đối với các database lớn, tuy nhiên lượng knowhow cần phải có và phương pháp tư duy đặc thù là những rào cản lớn đối với những Data Analyser hay ngay cả những DB engineer thông thường. Một Data Analyser muốn viết được job cho Map-Reduce, trước hết phải có kỹ năng của 1 Java Engineer, phải re-invent 1 số hàm common (JOIN, FILTER ...)

Yahoo đã giới thiệu 1 hướng tiệp cận khác: Pig Latin, là 1 programming language build trên top của Hadoop, cú pháp tương đối giống SQL thuần tuý, tuy nhiên ở tầng dưới có thể "translate" program execution thành các job Map-Reduce và trả lại kết quả với tốc độ của Map-Reduce.

Pig Latin (kể từ đây sẽ gọi tắt là "Pig") với bộ engine đằng sau là Java, có thể extend bằng các thư viện viết bằng Java hay thậm chí Python. Pig có hiệu suất phát triển cao, nghĩa là thay vì bỏ ra 1 tiếng để viết job 100 lines Map-Reduce bằng Java, bạn có thể chỉ cần 10 phút với 10 lines Pig :D

Ở các phần tiếp theo của bài viết này, bạn sẽ được giới thiệu những bước học hỏi đầu tiên của Pig Developer.

Get Start

Rất may là chúng ta không phải ngồi tưởng tượng chay cách hoạt động của Pig. Cloudera có free VM image, bạn chỉ cần down bản tương ứng về chạy trên Virtual Box hoặc VMWare.

Pig có cấu trúc khá tương đồng với SQL. Trước hết để làm với 1 cục dữ liệu cần phân tích, cần LOAD cả cục lên rồi tiến hành "mổ xẻ", sau đó STORE lại 1 file kết quả.


city = LOAD '/input/gotham/people.txt' AS (name:chararray, age:int, income:int);
citizens = ORDER city BY age;
max_age = LIMIT citizens 1;
STORE max_age INTO 'output/gotham/analysis1.txt'

people.txt là data đầu vào được tạo ra từ table trong DB.

Basic functions

Về cơ bản Pig có những function/commands sau :

  • LOAD, STORE: lấy dữ liệu trước khi xử lý và lưu sau khi xử lý. Ngoài ra DUMP có thể dùng để debug kiểu data.
  • GROUP, FILTER, ORDER BY, DISTINCT, LIMIT, UNION: những xử lý cơ bản giống hệt SQL.
  • FOREACH: loop function, để tạo nest operator (có thể hiểu đơn giản như cách tạo sub-query).
  • JOIN giống JOIN của SQL, cũng có INNER, LEFT OUTER hay RIGHT OUTER... Những bước JOIN trong Pig thường là những bước quan trọng khi muốn tạo relation từ 2 cục data riêng rẽ trở lên.
  • Eval functions (MAX, AVG, COUNT, SUM....).
  • Math functions (SIN, COS, TAN, SQRT, ...).
  • Tuple. Bag, Map functions. Phần này khá là khó và tác giả cũng không có nhiều kinh nghiệm sử dụng.
  • UDF (User Define Functions): là functions do developer tự viết bằng Java hoặc Python :D

Bạn có thể xem cụ thể ở Pig Latin Basics hoặc Pig Latin Built In Functions

Challenge 1: GROUP và FOREACH

Bài toán đơn giản đầu tiên, với data đầu vào là thông tin của các công dân thành phố gotham như ở trên, ta cần tìm người giàu nhất (income cao nhất) trong các nhóm độ tuổi 20~30, 30~40, 40~50, v.v..


city = LOAD '/input/gotham/people.txt' AS (name:chararray, age:int, income:int);
city_divide = FOREACH city GENERATE
    name,
    age/10 AS class,
    income;
city_classes = GROUP city_divide BY class;
citizens = FOREACH city_classes {
    ord = ORDER city_divide BY income;
    lim = LIMIT ord BY 1;
    GENERATE class*10 as class, lim.name AS name, lim.income AS income;

STORE citizens INTO 'output/gotham/analysis2.txt'

Đến đây chắc độc gỉả đã phần nào hình dung được data analyser dùng Pig Latin như thế nào :D

Challende 2: JOIN

Giả sử ngoài data về từng công dân của gotham, chúng ra có 1 data khác về các ..."super heroes", bao gồm "strength", "ability". Làm thế nào để biết các "super heroes" có thu nhập bao nhiêu trong cuộc sống thường ngày của họ ?


city = LOAD '/input/gotham/people.txt' AS (name:chararray, age:int, income:int);
heroes = LOAD '/input/gotham/heroes.txt' AS (name:chararray, strength:int, ability:chararray);

op = JOIN city BY name, heroes BY name;
opt = FOREACH op GENERATE
    $0 AS name,
    $1 AS age,
    $2 AS income,
    $4 AS strength,
    $5 AS ability;
STORE opt INTO 'output/gotham/analysis3.txt'

Ở đây bạn có thể để ý $0, $1, $2 lần lượt là name, age, income của biến city, $3, $4, $5 là name, strength, ability của biến heroes. Như vậy kết quả sau khi JOIN gồm tất cả các fields của 2 biến JOIN thành phần!

Pig Tuning

Qua 2 ví dụ trên đây, bạn có thể thế thấy Pig dễ phát triển như thế nào.
Tuy nhiên khi engineer hoàn toàn không có kinh nghiệm về Map-Reduce viết Pig thì chắc chắn sẽ không thể biết cách optimize để các job Hadoop bên dưới đạt tốc độ nhanh nhất có thể.

Để giữ có Pig program có hiệu suất xử lý cao, engineer có thể áp dụng các trick dưới đây:

  • Dùng FILTER nhiều nhất và sớm nhất có thể. Nếu bạn JOIN a và b rồi lại FILTER, thì hãy tìm cách FILTER a và b trước rồi hãy JOIN.

  • Loại bỏ các cột (các fields) không cần thiết. Giả sử biến a có 11 fields và bạn chỉ cần 7 fields, hãy FOREACH a GENERATE ($0...$6) để lập tức loại bỏ 4 fields.

  • PARALLEL là 1 magic keyword. Dùng PARALLEL để chỉ định số lượng reducers.

UDFs

Điều cuối cùng tác giả muốn chia sẻ, là khi bạn có những tasks xử lý nhỏ sử dụng nhiều lần với các fields, hãy cố gắng viết UDFs để xử lý. Pig được ship cùng với 1 package UDF viết sẵn Piggy Bank.

UDF có thể viết bằng Java hoặc Python. Java UDFs có tốc độ và khả năng ứng dụng trong Pig tốt hơn. Khi đã làm chủ được cấu trúc dữ liệu giữa Python/Java và Pig, bạn sẽ thấy UDFs là một feature mạnh mẽ và không thể sống thiếu :D

Tóm tắt:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Vu Nhat Minh

54 bài viết.
775 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
119 30
Nếu bạn thường vào trang mua sắm của amazon, chắc sẽ chẳng lạ gì với menu Shop by Department. Tốc độ hiển thị nội dung của menu là tức thì so với d...
Vu Nhat Minh viết gần 3 năm trước
119 30
White
93 4
Lời người dịch Người dịch là một developer , sau khi tìm đọc được bài viết này bằng bản gốc tiếng Anh đã cảm thấy như được "khai sáng" về khả năng...
Vu Nhat Minh viết 3 năm trước
93 4
White
61 7
Form là thành phần quan trọng nhất khi design flow đăng ký của 1 web hay 1 app, dù là view gồm nhiều bước hay chỉ là một màn hình đơn điệu. Bài này...
Vu Nhat Minh viết hơn 1 năm trước
61 7
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
54 bài viết.
775 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!