2014-01-23 62 views
0

試圖編譯我的豬UDF使用Maven時,我收到以下錯誤(或我的IDE的IntelliJ爲此事):豬UDF沒有找到WritableComparable

cannot access org.apache.hadoop.io.WritableComparable 
class file for org.apache.hadoop.io.WritableComparable not found 

所以我想我會添加一個依賴到hadoop核心到我的POM文件,但仍然沒有改變,雖然我檢查和WritableComparable類在jar中。

我的UDF類看起來是這樣的:

public class INCREMENTAL_UPDATE extends EvalFunc<DataBag> { 

    TupleFactory tupleFactory = TupleFactory.getInstance(); 
    BagFactory bagFactory = BagFactory.getInstance(); 


    public DataBag exec(Tuple input) throws IOException { 
     if (null == input || input.size() != 0) { 
      return null; 
     } 

     try { 
      DataBag inputbag = (DataBag) input.get(0); 
      Iterator it = inputbag.iterator(); 

      DataBag outputbag = bagFactory.newDefaultBag(); 

      Tuple previousTuple = null; 
      while (it.hasNext()) { 
       Tuple currentTuple = (Tuple) it.next(); 
       Tuple outputTuple = tupleFactory.newTuple(); 

       for (int i = 0; i < currentTuple.size(); i++) { 
        Object currentvalue = currentTuple.get(i); 
        if (currentvalue == null) { 
         outputTuple.append(currentvalue); 
        } else { 
         outputTuple.append(previousTuple.get(i)); 
        } 
       } 

       previousTuple = outputTuple; 
       outputbag.add(outputTuple); 
      } 
      return outputbag; 
     } catch (Exception e) { 
      throw new IOException("UDF INCREMENTAL_UPDATE failed"); 
     } 
    } 
} 

我還沒有這是否會實際工作要弄清楚,因爲我不能確定,如果UDF是分佈式的。如果是的話,那個previousTuple可能不會工作。但我甚至無法測試,因爲我無法編譯,因爲上面的錯誤。

+0

我沒有使用maven來編譯一個UDF jar,我只使用ant,所以我不能幫忙。但是你的'previousTuple'技巧是行不通的。 exec函數在每條記錄上運行,所以'previousTuple'將始終爲'null'。但是,您可以將'previousTuple'設爲類成員,並且可能會將其狀態轉移到下一條記錄。由於記錄可能以不可預知的順序進行處理,但目前還不清楚這是否有用。 –

回答

7

我也收到了這個錯誤,終於可以通過包含Hadoop類路徑和pig.jar文件進行編譯。

javac -cp pig-0.11.0.jar:\`hadoop classpath\` UPPER.java 

如果這不起作用,嘗試沒有斜線:

javac -cp pig-0.11.0.jar:`hadoop classpath` UPPER.java 
+0

謝謝,它幫助了我。 – Bector

2

包括hadoop-common-2.3.0.jar應該解決的例外。