2013-10-31 43 views
2

我有一個UDF jar,它通過Pig接受一個字符串作爲輸入。這個Java文件致力於通過豬罰款運行的「硬編碼」的字符串,比如這個命令使用Pig運行字符串通過Java使用Pig

B = foreach f generate URL_UDF.mathUDF('stack.overflow'); 

能不能給我我所期望的輸出

我的問題是我想從一個文本文件中獲取信息並使用我的UDF。我加載了一個文件,並希望在我已經加載到UDF的那個文件中傳遞數據。

LoadData = load 'data.csv' using PigStorage(','); 
f = foreach LoadData generate $0 as col0, $1 as chararray 

$ 1是一個char陣列被用來我所需要的列和研究數據類型(http://pig.apache.org/docs/r0.7.0/piglatin_ref2.html#Data+Types)。

然後我嘗試使用以下命令 B = foreach f生成URL_UDF.mathUDF($ 1);

傳遞數據放進玻璃瓶從而未能說明

java.lang.ClassCastException: org.apache.pig.data.DataByteArray cannot be cast to java.lang.String 

如果有人有任何解決方案,這將是巨大的。

我運行的Java代碼如下

package URL_UDF; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

import java.io.InputStream; 
import java.io.InputStreamReader; 

import org.apache.pig.FilterFunc; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.PigWarning; 
import org.apache.pig.data.Tuple; 
import org.apache.commons.logging.Log; 
import org.apache.*; 

public class mathUDF extends EvalFunc<String> { 

public String exec(Tuple arg0) throws IOException { 
    // TODO Auto-generated method stub 
    try{ 

     String urlToCheck = (String) arg0.get(0); 

     return urlToCheck; 
    }catch (Exception e) { 
     // Throwing an exception will cause the task to fail. 
     throw new IOException("Something bad happened!", e); 
    } 
} 

} 

感謝

回答

7

您可以用LOAD指定架構如下

LoadData = load 'data.csv' using PigStorage(',') AS (col0: chararray, col1:chararray); 

,並通過col1到UDF。

或者

B = foreach LoadData generate (chararray)$1 AS col1:chararray; 

其實,這是一種將固定在0.12.1在豬中的錯誤(PIG-2315)。 foreach中的AS子句並不像預期的那樣工作。

+0

感謝您的回答,不幸的是這仍然導致它失敗。 – user2931635

+0

然後這可能是您的UDF中的錯誤。你能發佈代碼嗎? – Frederic

+0

上面添加了這是我目前正在運行的一個簡單示例。我知道它什麼都不做,但即使這樣也失敗了。 – user2931635