我想通过 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 中的文件?
里面一个EvalFunc http://pig.apache.org/docs/r0.11.0/api/org/apache/pig/EvalFunc.html您可以通过以下方式从 HDFS 获取文件:
FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf());
in = fs.open(new Path(fileName));
BufferedReader br = new BufferedReader(new InputStreamReader(in));
....
您还可以考虑将文件放入分布式缓存中,在这种情况下您必须覆盖获取缓存文件() http://pig.apache.org/docs/r0.11.0/api/org/apache/pig/EvalFunc.html#getCacheFiles%28%29在您的 EvalFunc 类中。
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 and w2)以便从
每个工作节点的本地文件系统:
BufferedReader br = new BufferedReader(new FileReader(fileName));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)