一种可能的解决方案是在运行作业之前将 stopwords.txt 复制到 HDFS,然后在 Mapper 的setup方法中将其读入适当的数据结构。例如:
MyMapper 类:
...
private Map<String, Object> stopwords = null;
@Override
public void setup(Context context) {
Configuration conf = context.getConfiguration();
//hardcoded or set it in the jobrunner class and retrieve via this key
String location = conf.get("job.stopwords.path");
if (location != null) {
BufferedReader br = null;
try {
FileSystem fs = FileSystem.get(conf);
Path path = new Path(location);
if (fs.exists(path)) {
stopwords = new HashMap<String, Object>();
FSDataInputStream fis = fs.open(path);
br = new BufferedReader(new InputStreamReader(fis));
String line = null;
while ((line = br.readLine()) != null && line.trim().length() > 0) {
stopwords.put(line, null);
}
}
}
catch (IOException e) {
//handle
}
finally {
IOUtils.closeQuietly(br);
}
}
}
...
然后,您可以在 map 方法中使用停用词。
另一种选择是在 jobrunner 类中使用停用词创建映射对象,将其序列化为 Base64 编码的字符串,将其作为 Configuration 对象中某个键的值传递给映射器,并在 setup 方法中对其进行反序列化。
我会选择第一个选项,不仅因为它更容易,而且因为通过 Configuration 对象传递大量数据并不是一个好主意。