Pig Latin ── Language for Large Data Processing

来源:互联网 发布:特斯拉电池知乎 编辑:程序博客网 时间:2024/05/20 01:46

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


任務!

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


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

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

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

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



Pig 是什麼?

稍微精確一點地說,上面看到的程式語言叫做 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
嶄新的思維,運算邏輯分成一段段的 mapper/reducer
物件多、程式碼長
許多物件要維護,流程隱藏在多組的 mapper/reducer
花額外心力在初始化、資料型態、物件定義等等

Pig
很像 SQL,把複雜的 Map-Reduce 思維隱藏起來。擷取程序性語言(如 C, php)一步一步做的形式,和 SQL 複合子句的形態相比又更直覺些
程式碼短
程式易讀,從程式就可以看出整個執行的流程
專心在資料處理本身



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



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



參考連結

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