一个mapreduce同时加载读取多个文件的代码部分
Posted 吾生也有涯,而知也无涯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个mapreduce同时加载读取多个文件的代码部分相关的知识,希望对你有一定的参考价值。
方法一:
a.第一步:在job中加载两个文件所在的位置
FileInputFormat.setInputPaths(job, new Path[] { new Path("hdfs://192.168.9.13:8020/gradeMarking"),
new Path("hdfs://192.168.9.13:8020/implyCount") });
b.第二步:在Mapper类中重写setup方法,使用context对象获取该文件所在的文件名(如果是经过处理后的数据文件,因为文件名一样part-r-00000,所以要获取其所在的文件夹名)
@Override
protected void setup(Mapper<Text, Text, Text, Text>.Context context) throws IOException, InterruptedException {
FileSplit fs = (FileSplit) context.getInputSplit();
parentName = fs.getPath().getParent().getName();
}
方法二:
a.第一步:在job中将文件加载到本地
job.addCacheFile(new URI("hdfs://192.168.9.13:8020/meanwhileFind(同现)_data/part-r-00000"));
b.第二步:在Mapper函数中重写setup函数,用字符缓冲流进行读取
1 @Override 2 protected void setup(Mapper<LongWritable, Text, Text, Sort>.Context context) 3 throws IOException, InterruptedException { 4 @SuppressWarnings("resource") 5 BufferedReader br = new BufferedReader(new FileReader("part-r-00000")); 6 String str = null; 7 while ((str = br.readLine()) != null) { 8 String[] datas = str.split("\t"); 9 String[] sp = datas[0].split("-"); 10 if (!map.containsKey(sp[0])) { 11 HashMap<String, Double> mapInner = new HashMap<>(); 12 mapInner.put(sp[1], Double.parseDouble(datas[1])); 13 map.put(sp[0], mapInner); 14 } else { 15 @SuppressWarnings("rawtypes") 16 HashMap mapInner = map.get(sp[0]); 17 mapInner.put(sp[1], Double.parseDouble(datas[1])); 18 } 19 } 20 }
以上是关于一个mapreduce同时加载读取多个文件的代码部分的主要内容,如果未能解决你的问题,请参考以下文章
基于大数据开发套件定时调度带资源文件的MapReduce作业
Python问题:从一个文件夹中读取多个json文件只加载一个json