3

Java UDF 関数で小さなマップ ファイルを使用しており、コンストラクターを介して Pig からこのファイルのファイル名を渡したいと考えています。

以下は、私のUDF関数の関連部分です

public GenerateXML(String mapFilename) throws IOException {
    this(null);
}

public GenerateXML(String mapFilename) throws IOException {
    if (mapFilename != null) {
        // do preocessing
    }
}

Pigスクリプトには、次の行があります

DEFINE GenerateXML com.domain.GenerateXML('typemap.tsv');

これはローカル モードでは機能しますが、分散モードでは機能しません。コマンドラインで次のパラメーターをPigに渡しています

pig -Dmapred.cache.files="/path/to/typemap.tsv#typemap.tsv" -Dmapred.create.symlink=yes -f generate-xml.pig

そして、次の例外が発生しています

2013-01-11 10:39:42,002 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: Pig script failed to parse: 
<file generate-xml.pig, line 16, column 42> Failed to generate logical plan. Nested exception: java.lang.RuntimeException: could not instantiate 'com.domain.GenerateXML' with arguments '[typemap.tsv]'

それを機能させるために何を変更する必要があるか考えていますか?

4

2 に答える 2

4

問題は解決しました。

次のパラメーターを使用して Pig スクリプトを実行すると、

pig -Dmapred.cache.files="/path/to/typemap.tsv#typemap.tsv" -Dmapred.create.symlink=yes -f generate-xml.pig

/path/to/typemap.tsv、HDFS 内のパスではなく、ローカル パスである必要があります。

于 2013-01-14T05:54:19.350 に答える
2

関数は Pig UDF で使用できgetCacheFiles、それで十分です。 のような追加のプロパティを使用する必要はありませんmapred.cache.files。ケースは次のように実装できます。

public class UdfCacheExample  extends EvalFunc<Tuple> {

    private Dictionary dictionary;
    private String pathToDictionary;

    public UdfCacheExample(String pathToDictionary) {
        this.pathToDictionary = pathToDictionary;
    }

    @Override
    public Tuple exec(Tuple input) throws IOException {
        Dictionary dictionary = getDictionary();
        return createSomething(input);
    }

    @Override
    public List<String> getCacheFiles() {
        return Arrays.asList(pathToDictionary);
    }

    private Dictionary getDictionary() {
        // lazy initialization here
    }
}
于 2015-10-27T12:58:50.773 に答える