2015-05-21 62 views
-1

我需要使用Pig腳本實現的以下情形的邏輯。任何人都可以請幫忙提供一些關於如何做到這一點的想法。用於比較豬行的邏輯

輸入中包含一個列組名,其中包含一些其他數據和未知數據。這些數據需要被其先前的記錄數據取代。

輸入:

id,groupName 
123,casc0001 
124,casc0002 
125,sale0001 
126,unknown 
127,nave9876 
128,casc0001 
129,sale0002 
130,others 
131,casc0004 
132,unknown 
133,unknown 
134,others 
135,nave1234 

輸出:

123,casc0001 
124,casc0002 
125,sale0001 
126,sale0001 
127,nave9876 
128,casc0001 
129,sale0002 
130,sale0002 
131,casc0004 
132,casc0004 
133,casc0004 
134,casc0004 
135,nave1234 

在上述輸入126,未知與125,sale0001代替。 130,其他需要被129,sale0002取代。 132,未知133,未知134,其他將被替換爲131,casc0004。

- 編輯 -

我試過豬的鉛功能。但它僅用於一次比較n行。這不能完全解決這個問題。

另一個工作的邏輯,但尋找優化的一個。

Cogroup for the same data set (like Dataset and Dataset_self) 
-Filter Dataset.id=Dataset_self.id or Dataset_self.groupname='others' or  Dataset_self.groupname='unknown' 
-Generate IdDiff like (Dataset_self.id-Dataset.id), CASE when id=id then (id, group) else (id_self,group) 
-Foreach (group id){ 
     ordered = order by id,diff,group; 
     limited = ordered limit 1; 
     generate limited ; 
    } 
+0

你嘗試過什麼嗎? – Balduz

+0

您是否在尋找REPLACE功能。 http://stackoverflow.com/questions/23774447/pig-script-replace-with-pipe-symbol – Abhi

回答

0

這將是一個像hadoop這樣的分佈式系統上的複雜問題,特別是您的文件將在節點之間分裂。在你的情況下,如果126恰好是新分割中的第一條記錄。然後,您需要跟蹤以前的文件拆分,這很可能在不同的節點上。假設你想出了一個MapReduce程序來做到這一點,所有可能的情況下,這是一個非常緩慢和低效的方式來做到這一點。如果你在一個單一節點系統中,你的輸入格式的可拆分屬性是false,並且reducer的nuber被設置爲1,那麼解決方案可能會更簡單。在這種情況下,你幾乎可以說傳統的數據庫如Oracle或Terra數據可能更適合您的問題,因爲您有領先或滯後功能,可用於完全滿足您的需求。