hadoop用mutipleInputs實現map讀取不同格式的檔案

來源:互聯網
上載者:User

標籤: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讀取不同格式的檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.