从udf访问hdfs文件

llew8vvj  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(442)

我想从我的自定义项调用中访问一个文件。这是我的剧本:

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中。电话接通了。但文件似乎没有被发现。可能是因为我想访问hdfs上的文件。
如何从udf java调用访问hdfs中的文件?

s8vozzvw

s8vozzvw1#

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

相关问题