从 udf 访问 hdfs 文件

Posted

技术标签:

【中文标题】从 udf 访问 hdfs 文件【英文标题】:Access hdfs file from udf 【发布时间】:2013-07-07 16:36:10 【问题描述】:

我想从我的 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 中的文件?

【问题讨论】:

请分享您的UDF代码。 【参考方案1】:

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

那么您可以只传递文件的符号链接(w1w2)以便从中获取它们 每个工作节点的本地文件系统:

BufferedReader br = new BufferedReader(new FileReader(fileName));

【讨论】:

以上是关于从 udf 访问 hdfs 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 Pig UDF Java 类、Amazon EMR 中的分布式缓存访问文件

从 HIVE UDF 读取 HDFS 文件 - 执行错误,返回代码 101 FunctionTask。无法初始化类

Hive添加的文件在哪里?

Pig UDF 将文件写入 HDFS

在spark udf中读取hdfs上的文件

使用java读取存储在hdfs中的excel文件