PIG Study

PIG Study


  • 基礎概念:

Pig是基於hadoop的一個數據處理的框架。

Pig的數據處理語言是數據流方式的,類似於初中做的數學題。
Pig基本數據類型:int、long、float、double、chararray、bytearray
複合數據類型:Map、Tuple、Bag

和數據庫的對應關係:

<code>pig database
relation/bag table
tuple one record
field field(one volume)/<code>

但是pig中tuple的字段數是隨意的,這點和數據庫不同

  • 運行模式以及註釋:

運行模式

a) 本地

i. pig –x local

b) 集群

i. pig –x mapreduce

ii. 或者pig

c) 批處理命令

i. 將命令批量寫入xx.pig

ii. 用本地或者集群模式運行,如pig xx.pig

註釋

a) 段落註釋:/**/

b) 行註釋: --

  • 基本用法框架:

a) 輸入

i. A = Load ‘輸入路徑’ USING PigStorage(“\t”) AS (name:chararray, age:int, gpa:float);

ii. 邏輯:用pig自帶的PigStorage讀入輸入路徑的數據,對每一行用”\t”分割,並用字符串類型的name、int類型的age、float類型的gpq作為每行數據的字段名

b) 中間處理

i. B = FOREACH A GENERATE name;

c) 輸出

i. DUMP B; --輸出到控制檯

ii. 或者STORE B INTO ‘輸出路徑’ USING PigStorage();

  • 基本語法實例:

 計算多維度組合下的平均值 的實際例子

需求:求文件中第2、3、4組合的第4、5列的平均值

腳本解釋:

<code>A = Load '1.txt' USING PigStorage(' ') AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double);/<code>

A的結構是

<code>{col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double)}/<code>
<code>B = GROUP A BY (col2, col3, col4);/<code>

對A用col2/col3/col4的組合進行分組,然後按組將每條tuple彙集成一個bag,B的數據結構是B:{group:(col2,col3,col4),A:bag{:tuple,tuple}}

<code>C = FOREACH B GENERATE group, AVG(col5), AVG(col6);/<code>

FOREACH是遍歷每個組中彙集的tuple,並對其用組合函數處理字段C的結構是C:{group:(col2,col3,col4),double,double}

<code>DUMP C;//單機運行打印調試信息

STORE C INTO “output”;//存儲結果/<code>

統計行數

<code>A = LOAD '1.txt' USING PigStorage (' ‘) AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double); 

B = GROUP A all;

C = FOREACH B GENERATE COUNT(col2);

DUMP C;/<code>

注意:如果col2這一列有NULL,則這一行將不會被統計。

GROUP A all;沒有by關鍵字。

FLATTEN
同1中的例子,但是C不同

<code>C = FOREACH B GENERATE FLATTEN(group), AVG(col5), AVG(col6);/<code>

1中的例子得到的結果結構是(col2, col3, col4),avg1,avg2

但是對group作用FLATTEN後結構變為col2,col3,col4,avg1,avg2;可以看出FLATTEN的作用是解嵌套(un-nest)包或者元組tuple,

GROUP的兩點說明:

a)用於GROUP的key如果多於一個字段(正如本文前面的例子),則GROUP之後的數據的key是一個元組(tuple),否則它就是與用於GROUP的key相同類型的東西

b)GROUP後得到的結果是一個包或者是relation,其包含的每一個tuple中包含兩個字段,第一個字段被命名為'group',第二個字段是一個包,是含有group對應值的所有tuple的set。


分享到:


相關文章: