Pig Latin ── Language for Large Data Processing

|

這裡要介紹一種分析龐大資料的語言:Pig Latin。Pig 是一個 Hadoop 的子計劃。底下假設大家對 Map-Reduce 和 SQL 有基本的認識,但沒有也不要緊,我從一個例子談起。

 

任務!

假設我們有一份使用者和年齡的資料,以及一份他們去過哪些網站的記錄:

  pig_sampleinput_new.PNG這資料很大很大,放在 hadoop 上面。如果想要知道「18歲到25歲的使用者看的百大網站」,該怎麼做呢?

在 Hadoop 上寫程式解決問題有很多方式:可以用 native API 寫 Map-Reduce 或者用 streaming。在這裡要介紹的是另一種方式 ── 利用 Pig。

如果用 Pig ,你只需把這短短的程式碼存起來:

pig_samplecode_new.PNG然後在命令列下打 pig myscript.pig 執行後就解決了。這程式碼有沒有感覺和 SQL 有點像呢!這就是 Pig 的特色。

 

pig_stack.PNGPig 是什麼?

稍微精確一點地說,上面看到的程式語言叫做 Pig Latin 。我們可以用 Pig 這個系統,把 Pig Latin 語言翻譯成 Map-Reduce 的樣子並且讓 Hadoop 來執行。

Pig Latin 是專門設計來做大量資料分析的語言。雖然分析有百百種,不過 Pig Latin 挑選大家常會用的操作變成指令,例如 GROUP、FILTER、JOIN 等等,和 SQL 很類似。如果要在 Hadoop 上對資料進行這一類的處理,Pig Latin 是個可以考慮的工具。

 

Pig 好玩嗎?

Pig Latin 具有下面的特點:

資料承載擴充性高

Pig Latin 設計理念是能在多台機器上平行執行的語言 ── 例如在 Hadoop 平台上。Pig 的運算指令都是挑選過,適合平行運算的才納入。即使資料越來越大,對於撰寫 Pig Latin 的人來說是完全透明的,並不會感受到任何影響(就像上面的範例程式,你不會看到資料要去哪幾台拿,運算要分散到哪些機器上算)。

功能彈性

Pig Latin 和 SQL 類似,是由一些高階抽象的指令組合而成,如果拿語言本身與 C, Java 相比並不能說有彈性。但 Pig 有兩個很重要的進階功能,讓大家在處理問題的時候更有彈性:一個是 User-defined Functions (UDF,使用者定義函式),另一個是 Embedded Pig (內嵌式 Pig)。前者讓你用 Java 寫比較複雜的函式,然後在你的 Pig 主程式裡使用之。後者則是相反,讓你能在你的 Java 主程式內嵌執行一些 Pig 的指令(就如在 php 裡執行 MySQL 一樣)

 

我們把 native API 寫 map-reduce 和 Pig 相比較的話:

Map-Reduce
using native API
Pig
嶄新的思維,運算邏輯分成一段段的 mapper/reducer 很像 SQL,把複雜的 Map-Reduce 思維隱藏起來。擷取程序性語言(如 C, php)一步一步做的形式,和 SQL 複合子句的形態相比又更直覺些
物件多、程式碼長 程式碼短
許多物件要維護,流程隱藏在多組的 mapper/reducer 程式易讀,從程式就可以看出整個執行的流程
花額外心力在初始化、資料型態、物件定義等等 專心在資料處理本身

上面的比較並不是絕對的:跟問題的本質、開發者的習慣、熟練度等等也很有關,但一般來說,Pig 具有容易學、開發快、好維護等特性。

 

講了這麼多 Pig 的好處,那到底該怎麼寫呢?關於 Pig Latin 的語法將會有另一篇文章來介紹,讓大家更了解 Pig,更了解一個強大的工具。

 

參考連結

Pig website: http://hadoop.apache.org/pig/

Pig paper: http://www.cs.cmu.edu/~olston/publications/sigmod08.pdf