从udf访问hdfs文件

时间:2013-07-07 16:36:11

标签: hadoop apache-pig hdfs

我想从我的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)}; 

罐子已注册。该路径对我的hdfs是实际的,文件确实存在。打电话。但似乎没有发现该文件。也许是因为我正在尝试访问hdfs上的文件。

如何从我的UDF java调用中访问hdfs中的文件?

1 个答案:

答案 0 :(得分: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()

E.g:

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