Apache Pig

What is Pig

Apache Pig是MapReduce的一個抽象,它是一個工具/平臺(所以說它並不完全是一門語言),用於分析較大數據集,並將其表示爲數據流;

Pig通常與Hadoop一起使用,使用Pig進行數據處理、分析時,需要使用其提供的Pig Latin腳本語言編寫相應腳本,這些腳本執行時會被轉換爲Map和Reduce任務(類似Spark),Pig Engine組件接受Pig Latin腳本爲輸入,並轉換爲作業;

Why Pig

可以把Pig看作是SQL,相對於java等高級語言來說,它的功能更加簡單直接,更容易上手,同時又不像直接寫MapReduce程序那樣考慮太多分佈式相關內容,因此Pig是一種較爲適中的用於在分佈式集羣上進行作業編寫的腳本語言;

Component in Pig

Parser:解析Pig腳本,檢查其語法以及其他雜項,輸出有向無環圖DAG,其中運算符爲節點,數據流爲邊;

Optimizer:進行邏輯優化,例如投影和下推;

Compiler:將邏輯計劃轉爲一系列MapReduce作業;

Execution engine:提交MapReduce作業到Hadoop;

DataType in Pig

Atom:任何單個值,無論其數據類型,都認爲是原子的;

Tuple:存儲一系列字段值,可以是任何類型,類似行;

Bag:一組無序的元組,每個元組中字段數量任意,也就是不需要對齊;

Map:key-value對,key需要是chararray類型且需要唯一;

Relation:一個關係是一個元組的包;

Run with Pig

Grunt Shell:以交互式的方式運行Pig代碼,類似python shell;

Script:以腳本方式運行Pig代碼,類似python腳本;

UDF:嵌入java等語言使用;

Grunt Shell in Pig

sh:在grunt shell中使用任何shell命令,比如ls;

fs:在grunt shell中使用任何Hadoop命令,比如fs -ls;

command:clear、help、history、set、quit、exec、run、kill;

Pig Latin

DataModel:Relation -> (Tuple,Tuple) -> ((name,age),(name,age,job)) -> ((張三,15),(李四,16,學生))

DataType:int、long、float、double、chararray、Bytearray、Boolean、Datetime、Biginteger、Bigdecimal、Tuple、Bag、Map、Null;

算術運算符:+ - * / % ?:三元運算符 CASE WHEN THEN ELSE多選語句;

比較運算符:== != > < >= <= matches模式匹配;

類型結構運算符:()-Tuple、{}-Bag、[]-Map;

關係運算符:LOAD(將數據從fs加載到關係)、STORE(將數據從fs存儲到關係)、FILTER(從關係中刪除行)、DISTINCT(從關係中刪除重複行)、FOREACH(基於數據列生成數據轉換)、GENERATE、STREAM(使用外部程序轉換關係)、JOIN(連接兩個或多個關係)、COGROUP(將數據分組爲兩個或多個關係)、GROUP(在單個關係中對數據分組)、CROSS(創建兩個或多個關係的向量積)、ORDER(基於一個或多個字段排序關係)、LIMIT(從關係中獲取有限個元組)、UNION(將兩個或多個關係合併爲單個關係)、SPLIT(將單個關係拆分爲兩個或多個關係)、DUMP(在console上打印關係內容)、DESCRIBE(描述關係模式)、EXPLAIN(查看邏輯、物理或MapReduce執行計劃以計算關係)、ILLUSTRATE(查看一系列預測的分步執行);

語句:使用Relation,包括expression和schema,以分號結束,使用運算符執行操作,除LOAD和STORE外,其餘語句均採用Relation作爲輸入,併產生另一個Relation作爲輸出;

grunt> student_data = LOAD 'student_data.txt' USING PigStorage(',') as (id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray)

Function case with Pig

在交互式過程中,定義的Relation都沒有真正的執行,真正執行需要類似DUMP、LOAD、STORE等操作纔會觸發,類似Spark中的Action算子;

student = LOAD './pig/student.txt' USING PigStorage(',') as (id:int, firstname:chararray, lastname:chararray, phone:chararray,city:chararray);
STORE student INTO './pig/pig_output/' USING PigStorage('\t');
student_filter = FILTER student BY ENDSWITH(firstname,'i')
DUMP student_filter;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章