2

Pig を介して文字列を入力として受け取る UDF jar があります。この Java ファイルは、このコマンドのような「ハード コードされた」文字列を実行するので、ピッグ ファインを介して機能します。

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 は必要な列であり、データ型を調査しています ( http://pig.apache.org/docs/r0.7.0/piglatin_ref2.html#Data+Types ) char 配列が使用されます。

次に、次のコマンドを使用してみました B = foreach f generate URL_UDF.mathUDF($1);

失敗したjarにデータを渡す

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);
    }
}

}

ありがとう

4

1 に答える 1

7

次のように LOAD でスキーマを指定できます。

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

col1UDFに渡します。

または

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

実際、これは Pig のバグ ( PIG-2315 ) であり、0.12.1 で修正される予定です。foreach の AS 句が期待どおりに機能しません。

于 2013-10-31T11:57:28.747 に答える