Pig優化之路之巧用Macro

2021-06-28 03:14:22 字數 2188 閱讀 2839

部署好了hadoop集群後,安裝完畢hive,pig...後乙個大資料的美好入口就建立了。我們可以用hive來做基於結構化**的資料分析,用pig來做資料清洗,資料探勘等工作。

特別在實踐中,感覺pig很不錯,沒有hive的嬌貴,又比粗糙的mapreduce來的精巧,很稱手。新年正好涉及以前的程式調整,藉此之機,對pig寫的指令碼進行了優化。畢竟,越用越熟,越能發現pig的魅力。

curr_cnt = group curr_uids_dis all;

curr_all_ct = foreach curr_cnt generate count(curr_uids_dis.uid) ;

其實上面**的作用就是取出curr_uids_dis資料集的記錄條數。但無奈以前對對pig知之甚少,只能遇河搭橋。河過多了,不同的橋也架多了,導致**非常臃腫。

怎麼辦?

這就要深挖一下pig的語法了,在pig中,有乙個非常有用的巨集定義功能。先說簡單的,直接關聯乙個udf的,語法如下:

define datatypevalidationudf com.validation.datatypevalidationudf(); --相當於定義了乙個macro datatypevalidationudf
以後使用的時候,就直接

dealdata = datatypevalidationudf(claim_amount) ;
當然,如果要自定義乙個複雜的處理巨集,就可以這麼來,語法如下:

define func1(logs) returns numerical_row;
這樣,辦法就來了,我們可以把求資料集條數的語句做乙個封裝。以後只要呼叫這個macro就可以了。

/*

define the macro, specify the input parameters and the return value

*/define getdatasize(logs) returns numerical_row;

但按照我們有追求的程式猿來說,還想幹的更完美,我們想把所有的巨集都封裝到乙個檔案裡,然後在相關程式裡引用後再呼叫。

問題來了,如何做?我們又翻開pig的語法,開始挖掘。

正好,pig有這個功能,語法如下:

/*

import macro defined in the file util.pig

*/import '/***/***/util.pig';

好了,知道如何打造我們的工具庫後,我們程式可以這麼來寫了。

register 'piggybank.jar';

import '/xx/util.pig';

logs = load '/in_off/tree_2013/*' using pigstorage('\t') as (uid) ;

ret = getdatasize(logs) ;

dump ret;

然後,我們的util.pig清單如下

/*

util.pig place all util macro

*/define getdatasize(logs) returns numerical_row;

以後,我們可以在這裡定義所有的工具巨集了。

貌似都完成了,但完美的程式猿發現,好像還是有個東西挺彆扭。

如果有多個pig檔案要import,那同樣路徑得寫好多個啊,浪費。

pig語法又來了,可以設定pig的檔案包含路徑。

set pig.import.search.path '/***/***x';
這樣優化後的總體程式是:

register 'piggybank.jar';

set pig.import.search.path '/***/***x';

import 'util.pig';

logs = load '/in_off/tree_2013/*' using pigstorage('\t') as (uid) ;

ret = getdatasize(logs) ;

dump ret;



Pig效能優化

mapreduce job的很大一部分開銷在於磁碟io和資料的網路傳輸,如果能盡早的去除無用的資料,減少資料量,會提公升pig的效能。使用filter可以去除資料中無用的行 record 盡早的filter掉無用的資料,可以減少資料量,提公升pig效能。使用foreach generate可以去除資...

報表效能優化方案之巧用相鄰連續分組

1.問題描述 在資料顯示方式章節內容中,我們已介紹分組的兩個不同使用場景 普通分組和相鄰連續分組。但其使用相鄰連續分組功能,更主要原因是能夠提高其報表的效能。示例報表開發工具 finereport 2.原理 相鄰連續分組的操作,是將資料集中連在一起的相同資料才進行合併的。尤其是,在配合sql中已排好...

Pig對於資料傾斜Join的優化原理

pig對於資料傾斜join的優化原理 1 對資料抽樣 2 根據樣本資料,估計出某個key的所有的記錄數以及所佔的總記憶體,pig.skewedjoin.reduce.memusage 控制reduce消耗記憶體比例,再計算出某個key所需要的reduce個數,以及reduce的總數。3 將結果存乙個...