2013-11-09 66 views
2

我有一個Pig作業,每天運行一些用戶帳戶,每個用戶每天都有一些交易。作爲該過程的一部分,該PIG寫出用戶每天分組的事務(作爲使用Avro的旁路)。在連接的PIG輸入文件中合併相似的組

我現在想要將每個用戶帳戶和流程的所有交易分組在一起(或更長時間)。

我可以通過在PIG中的蠻力做到這一點,但似乎必須有更好的辦法,而不是將所有交易進行扁平化和重新分組。更詳細地說...

起點適用...(a是用戶,(b,c)和(d,e)表示兩個轉換,如do(f,g)和(h,i)

我讀...

(a,{(b,c),(d,e)}) -- From first file - Monday 
(a,{(f,g),(h,i)}) -- from second file - Tuesday 

我想...

(a,{(b,c),(d,e),(f,g),(h,i)}) 

我親近與腳本...

-- Read in multiple days (one day per file, $input is directory with all files) 
DayGroupedRecord = LOAD '$input' USING AvroStorage(); 
FlattenRecord = FOREACH DayGroupedRecord GENERATE $0 AS Key, FLATTEN ($1); 
WeeklyGroup = GROUP FlattenRecord BY $0; 

這給

(a,{(a,b,c),(a,d,e),(a,f,g),(a,h,i)}) 

這是不夠好。然而,由於輸入記錄已經被分組,所以該組必須在每個事務級別上操作似乎效率低下。

PIG有沒有不同的方法(也許更有效),我將日常組分組然後平坦化?

我試圖(和失敗)與...

DayGroupedRecord = LOAD '$input' USING AvroStorage(); 
WeeklyGroupNested = GROUP DayGroupedRecord BY $0; 
WeeklyGroup = FOREACH WeeklyGroupNested GENERATE FLATTEN($1); 

集團化運作看起來很有希望...

(a,{(a,{(b,c),(d,e)}),(a,{(f,g),(h,i)})}) 

但我不能找出如何變平的內上面的包......腳本已經讓我回到了我開始的地方......我嘗試了許多變形,但沒有成功(主要是生成PIG錯誤)。

這就是我得到的和上面的腳本(而不是我想要的)。

(a,{(b,c),(d,e)}) 
(a,{(f,g),(h,i)}) 

作爲Newbe豬,我可以得到豬扁平化的內袋,並得到接近我想要的:

(a,{(b,c),(d,e),(f,g),(h,i)}) 

菲爾

回答

0

你有沒有嘗試過的「強力」方法並比較資源消耗和你在什麼時候得到的資源消耗,例如GROUP,而忘記試圖將交易放到一個包裏?你可能不會發現暴力方法優雅,但想一想它正在做什麼,以及它是否真的效率低下。

您的理想方式是按用戶分組併合並所有分組在一起的行李。這意味着將每個輸入記錄的密鑰和事務包發送給某個還原器。從那裏你將不得不遍歷袋子,抽出每筆交易,並將其放入該用戶的最終包中。

蠻力方法使用FLATTEN,以便對於每個輸入記錄中的每個事務,將密鑰和事務發送給某個還原器。這裏通過重複發送用戶ID來實現一些重複,但這不是什麼大問題,特別是如果交易數據的大小遠遠大於用戶ID的大小。從那裏,您只需將每筆交易添加到該用戶的最後一個包中即可。

這對我來說聽起來並不是特別低效,它不涉及任何額外的map-reduce步驟。從映射器發送到還原器的數據的大小非常接近。我懷疑,通過在整個計算過程中保持一天的交易量,你不會大幅提高性能。