2014-01-23 2 views
0

Я получаю следующее сообщение об ошибке при попытке компиляции моего Pig UDF с Maven (или с моей IDE IntelliJ по этому вопросу):Pig UDF не находя WritableComparable

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

Так я решил добавить зависимость to hadoop-core для моего POM-файла, но все равно никаких изменений, хотя я проверил и класс WritableComparable находится в банке.

Мой 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 распространяется. Если это так, что предыдущий Tuple, вероятно, не сработает. Но я не могу даже проверить это, потому что я не могу скомпилировать из-за ошибки выше.

+0

Я не использовал maven для компиляции бара UDF, я использую только муравей, поэтому я не могу с этим поделать. Но ваш трюк 'previousTuple' не будет работать. Функция 'exec' запускается на каждой записи, поэтому' previousTuple' всегда будет 'null'. Однако вы можете сделать 'предыдущийTuple' членом класса, и он, вероятно, перенесет его состояние в следующую запись. Поскольку записи могут обрабатываться в непредсказуемом порядке, однако, неясно, было ли это полезно. –

ответ

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 должны решить исключение.

Смежные вопросы