標籤:blog http ar io os 使用 sp for java
mapmap讀取不同格式的檔案這個問題一直就有,之前的讀取方式是在map裡擷取檔案的名稱,按照名稱不同分不同的方式讀取,例如下面的方式
//取檔案名稱InputSplit inputSplit = context.getInputSplit();String fileName = ((FileSplit) inputSplit).getPath().toString();if(fileName.contains("track")) {} else if(fileName.contains("complain3")) {}
這種方式有兩個問題,一是在每讀入一條資料的時候都要擷取檔案的名稱,二是要根據名稱判斷按照什麼樣的格式進行解析,顯得很醜陋,其實hadoop提供瞭解決這個問題的方法
使用mutipleInputs來解決
public class MutipleInputsTest {private static String complain = "/dsap/rawdata/operate/complain3/";private static String csOperate = "/dsap/rawdata/creditSystemSearchLog/";private static String output = "/dsap/rawdata/mutipleInputsTest/result1";public static class Mapper1 extends Mapper<Object, Text, Text, Text>{public void map(Object key, Text value, Context context ) throws IOException, InterruptedException {Counter counter = context.getCounter("myCounter", "counter1");counter.increment(1l);}}public static class Mapper2 extends Mapper<Object, Text, Text, Text>{public void map(Object key, Text value, Context context ) throws IOException, InterruptedException {Counter counter = context.getCounter("myCounter", "counter2");counter.increment(1l);}} public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = new Job(conf, "mutipleInputsTest");job.setJarByClass(MutipleInputsTest.class);MultipleInputs.addInputPath(job, new Path(complain + "20141217"), TextInputFormat.class, Mapper1.class);MultipleInputs.addInputPath(job, new Path(csOperate + "20141217"), TextInputFormat.class, Mapper2.class);FileOutputFormat.setOutputPath(job, new Path(output));job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);job.waitForCompletion(true);/**擷取自訂counter的大小,如果等於質心的大小,說明質心已經不會發生變化了,則程式停止迭代*/long counter1 = job.getCounters().getGroup("myCounter").findCounter("counter1").getValue();long counter2 = job.getCounters().getGroup("myCounter").findCounter("counter2").getValue();System.out.println("counter:" + counter1 + "\t" + counter2);}}
看一下運行結果
可以看到兩個不同格式的檔案進入了兩個不同的mapper進行處理,這樣在兩個mapper裡就可以只針對某一種格式的檔案進行解析了
hadoop用mutipleInputs實現map讀取不同格式的檔案