2017-03-02 12 views
2

私のレデューサー出力ファイルの名前を正しく変更できますが、r-00000は依然として永続しています。 私のレデューサークラスでMultipleOutputsを使用しました。 ここにその詳細があります。何が紛失しているのか、何が余計に必要なのかわからないのですか?mapreduceのレデューサー出力からr-00000エクステンションを削除するには

public class MyReducer extends Reducer<NullWritable, Text, NullWritable, Text> { 

    private Logger logger = Logger.getLogger(MyReducer.class); 
    private MultipleOutputs<NullWritable, Text> multipleOutputs; 
    String strName = ""; 
    public void setup(Context context) { 
     logger.info("Inside Reducer."); 
     multipleOutputs = new MultipleOutputs<NullWritable, Text>(context); 
    } 
    @Override 
    public void reduce(NullWritable Key, Iterable<Text> values, Context context) 
      throws IOException, InterruptedException { 

     for (Text value : values) { 
      final String valueStr = value.toString(); 
      StringBuilder sb = new StringBuilder(); 
      sb.append(strArrvalueStr[0] + "|!|"); 
      multipleOutputs.write(NullWritable.get(), new Text(sb.toString()),strName); 
     } 
    } 

    public void cleanup(Context context) throws IOException, 
      InterruptedException { 
     multipleOutputs.close(); 
    } 
} 
+0

この質問は重複していると思われます。 http://stackoverflow.com/questions/27488624/how-to-change-the-output-file-name-from-part-00000-in- reducer-to-inputfile-name –

+0

generateFileName()メソッドをオーバーライドしましたが、r-0000拡張子を削除できませんでした。 – SUDARSHAN

答えて

1

私は私の仕事が終了した後、明示的にそれを行うことができたし、仕事にme.No遅延のために[OK]をthatsの

if (b){ 
      DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HHmm"); 
      Calendar cal = Calendar.getInstance(); 
      String strDate=dateFormat.format(cal.getTime()); 
      FileSystem hdfs = FileSystem.get(getConf()); 
      FileStatus fs[] = hdfs.listStatus(new Path(args[1])); 
      if (fs != null){ 
       for (FileStatus aFile : fs) { 
        if (!aFile.isDir()) { 
         hdfs.rename(aFile.getPath(), new Path(aFile.getPath().toString()+".txt")); 
        } 
       } 
      } 
     } 
+0

spark出力で同じことを行うには? –

0

問題へのより適切なアプローチがOUTPUTFORMATを変更することになります。

例: - TextOutputFormatClassを使用している場合は、TextOutputFormatクラスのソースコードを取得し、適切なファイル名(r-00000なし)を取得するために以下のメソッドを変更してください。ドライバで変更された出力形式を設定する必要があります。

public synchronized static String getUniqueFile(TaskAttemptContext context, String name, String extension) { 
    /*TaskID taskId = context.getTaskAttemptID().getTaskID(); 
    int partition = taskId.getId();*/ 
    StringBuilder result = new StringBuilder(); 
    result.append(name);   
    /* 
    * result.append('-'); 
    * result.append(TaskID.getRepresentingCharacter(taskId.getTaskType())); 
    * result.append('-'); result.append(NUMBER_FORMAT.format(partition)); 
    * result.append(extension); 
    */ 
    return result.toString(); 
} 

したがって、複数の出力に渡される名前は、それに応じて作成されます。

関連する問題