試圖編譯我的豬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可能不會工作。但我甚至無法測試,因爲我無法編譯,因爲上面的錯誤。
我沒有使用maven來編譯一個UDF jar,我只使用ant,所以我不能幫忙。但是你的'previousTuple'技巧是行不通的。 exec函數在每條記錄上運行,所以'previousTuple'將始終爲'null'。但是,您可以將'previousTuple'設爲類成員,並且可能會將其狀態轉移到下一條記錄。由於記錄可能以不可預知的順序進行處理,但目前還不清楚這是否有用。 –