2013-04-05 67 views
2

我有一個使用AvroKeyOutput作爲輸出格式的Reducer。默認情況下,MapReduce會將所有密鑰寫入單個輸出文件。我想爲每個鍵值寫入一個單獨的輸出文件。 Avro提供了AvroMultipleOutputs方法,但示例很苗條。 Apache AvroMultipleOutputs提供的一個演示瞭如何在定義作業時預先配置各種輸出。這些例子表明:

伯:
AvroMultipleOutputs.addNamedOutput(job, "avro1", AvroOutputFormat.class, schema);
AvroMultipleOutputs.addNamedOutput(job, "avro2", AvroOutputFormat.class, null);

減速機:
amos = new AvroMultipleOutputs(conf);
amos.getCollector("avro1", reporter).collect(datum);
amos.getCollector("avro2", "A", reporter).collect(datum);
amos.getCollector("avro3", "B", reporter).collect(datum);
用AvroMultipleOutputs創建多個輸出文件

但我不知道有多少文件,我需要或他們的名字是什麼,因爲它是基於從我的減速機出來的關鍵值。我如何修改這個以適應動態文件命名?

回答

1

一個戰略,你可以在這種情況下使用:

  • 使用僅地圖作業(零reduce任務)
  • map()在一個名爲多輸出配置
  • 使用你的鍵值爲基地輸出路徑在AvroMultipleOutputs.write(String namedOutput, Object key, Object value, String baseOutputPath)
+0

謝謝,這是一個更簡單的解決方案。我清楚地表明瞭這一點。 – RedRobin2202 2013-06-12 12:58:49

+1

有沒有辦法在沒有Map-only作業的情況下完成此操作? – technocrat 2015-04-01 21:29:13

+0

是的。我假設你仍然想用Map-Reduce做到這一點,對吧?你需要考慮你的分組策略,並且假設你在每個(r)reducer中都得到了(n)個鍵,那麼最多隻能得到多個輸出文件。再次,使用單個名稱,但使baseOutputPath值使用您的密鑰的字符串值。 – ohhorob 2015-04-17 17:58:23