2013-03-27 29 views
0

我正在試驗Pig UDF。我能夠得到像大寫字母這樣簡單的UDF爲我工作。所以我試圖寫我自己的UDF。我想處理包含3個整數的輸入文件的每一行。如果3個整數滿足直角三角形邊的條件,則返回斜邊,否則返回null。PigLatin - 本地模式 - 錯誤1066:無法打開別名的迭代器B

但我得到下面的錯誤 - 錯誤1066:無法打開迭代器的別名乙

這裏是豬腳本代碼 -

-- rat.pig - A Pig script to test right angle triangle 
REGISTER /Users/admin/Programming/PigUDF/bin/myudfs/myudfs.jar; 
A = LOAD '/Users/admin/Programming/pigdata/triangle.csv' AS (sides: tuple(side_0:int, side_1:int, side_2:int)); 
B = FILTER A BY (myudfs.RAT(A.sides)!= 0); 
DUMP B; 

的UDF就像

包myudfs;

import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 

public class RAT extends EvalFunc<Integer>{ 
    public Integer exec(Tuple input) throws IOException { 
     if (input == null || input.size() == 0) { 
      return null; 
     } 
     try { 
      int num_0 = (Integer)input.get(0); 
      int num_1 = (Integer)input.get(1); 
      int num_2 = (Integer)input.get(2); 

      if ((num_0 * num_0) + (num_1 * num_1) == num_2 * num_2) 
       return Integer.valueOf(num_2); 
      else if ((num_0 * num_0) + (num_2 * num_2) == num_1 * num_1) 
       return Integer.valueOf(num_1); 
      else if ((num_1 * num_1) + (num_2 * num_2) == num_0 * num_0) 
       return Integer.valueOf(num_0); 
      else { 
       return null; 
      } 
     } catch (Exception e) { 
      throw new IOException(" Caught exception processing input row", e); 
     } 
    } 

} 

我想知道我在做什麼錯在這裏。任何指針讚賞。謝謝。

+0

對於在尋找[錯誤1066:無法打開迭代器別名]時發現此帖子的人(http://stackoverflow.com/questions/34495085/error-1066-unable-to-open-iterator-for- alias-in-pig-generic-solution)這裏是一個[通用解決方案](http://stackoverflow.com/a/34495086/983722)。 – 2015-12-28 15:33:35

回答

0

Sumod,

您需要做幾項改變。

您的LOAD語句似乎沒有生成適當的元組。而且功能也需要稍微改變。

請參閱我所做的代碼修改。有任何問題請告訴我。

REGISTER PIGTrnFilter.jar; 
A = LOAD '/home/hadoop/lab/examples/PigTrnTest.txt' AS (side_0:int, side_1:int, side_2:int); 
B = FILTER A BY (inverika.training.examples.RAT(TOTUPLE(A.side_0, A.side_1, A.side_2)) != 0); 
DUMP B; 

過濾功能如下。

package inverika.training.examples; 

import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 

public class RAT extends EvalFunc<Integer>{ 
    public Integer exec(Tuple TT) throws IOException { 
     if (TT == null || TT.size() == 0) { 
      return null; 
     } 
     try {   
      Object tupleObject = TT.get(0); 

      Tuple input = (Tuple) tupleObject; 

      Object object0 = input.get(0); 
      Object object1 = input.get(1); 
      Object object2 = input.get(2); 

      int num_0 = (Integer) object0; 
      int num_1 = (Integer) object1; 
      int num_2 = (Integer) object2; 

      if ((num_0 * num_0) + (num_1 * num_1) == num_2 * num_2) 
       return Integer.valueOf(num_2); 
      else if ((num_0 * num_0) + (num_2 * num_2) == num_1 * num_1) 
       return Integer.valueOf(num_1); 
      else if ((num_1 * num_1) + (num_2 * num_2) == num_0 * num_0) 
       return Integer.valueOf(num_0); 
      else { 
       return new Integer(0); 
      } 
     } catch (Exception e) { 
      throw new IOException(" Caught exception processing input row", e); 
     } 
    } 
} 

請注意,我使用了Tab分隔的數據而不是csv。如果有一個csv,那麼你需要使用PigStorage函數來加載。

1 2 3 
2 5 2 
2 2 2 
1 3 7 
7 2 10 
3 4 5 

我做了一些小的修改,我猜你可以按照。查看關係模式以瞭解我所做的更改。實際上可以使用一個FilerFunc,它返回布爾值而不是EvalFunc。希望這可以幫助你。

+0

假設輸入格式正確,'(邊:元組(side_0:int,side_1:int,side_2:int));'實際上是正確的。例如,輸入需要格式化(123,234,345)。 – Frederic 2013-03-27 15:32:36

+0

Fred,我嘗試了上面的語法。它正確地創建了模式,但DUMP給了我空元組。你能分享你的示例代碼和數據嗎? – Rags 2013-03-28 03:58:17

+0

謝謝拉格斯和弗雷德。我嘗試了Rags建議的方法。我將輸入格式從(num1,num2,num3)更改爲num1 num2 num3。然後我在Java代碼中做了一些修改。現在,這是發生了什麼。加載和過濾時不會出現任何錯誤。但是當我運行「說明B」時,出現錯誤 - org.apache.pig.backend.executionengine.ExecException:錯誤0:標量在輸出中有多行。 – Sumod 2013-04-07 09:29:02