3

udf 呼び出しからファイルにアクセスしたいと思います。これは私のスクリプトです:

files = LOAD '$docs_in' USING PigStorage(';') AS (id, stopwords, id2, file);
buzz = FOREACH files GENERATE pigbuzz.Buzz(file, id) as file:bag{(year:chararray, word:chararray, count:long)}; 

jar が登録されます。パスは、ファイルが実際に存在する私の hdfs に現実的です。コールが行われます。しかし、ファイルが検出されていないようです。hdfs上のファイルにアクセスしようとしているからかもしれません。

UDF Java 呼び出しから hdfs のファイルにアクセスするにはどうすればよいですか?

4

1 に答える 1

5

EvalFunc内では、次の方法で HDFS からファイルを取得できます。

FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf());
in = fs.open(new Path(fileName));
BufferedReader br = new BufferedReader(new InputStreamReader(in));
....

ファイルを分散キャッシュに入れることも検討できます。その場合、EvalFunc クラスでgetCacheFiles()をオーバーライドする必要があります。

例えば:

@Override
public List<String> getCacheFiles() {
  List<String> list = new ArrayList<String>(2);
  list.add("/cache/pig/wordlist1.txt#w1");
  list.add("/cache/pig/wordlist2.txt#w2");
  return list;
}

次に、ファイルのシンボリック リンク ( w1およびw2 ) を渡すだけで、各ワーカー ノードのローカル ファイル システムからファイルを取得できます。

BufferedReader br = new BufferedReader(new FileReader(fileName));
于 2013-07-07T19:00:30.137 に答える