2015-09-23 2 views

ответ

2

This статья поможет вам создать собственный Inputformat с помощью CombineFIleInputFOrmat для чтения и обработки файлов gzip. Ниже детали дадут вам представление о том, что нужно сделать.

Пользовательские InputFormat:

Создайте свой собственный combinefileinputformat почти такой же, как и у combinefileinputformat. Ключ должен быть нашим собственным классом записи, который будет содержать имя файла, смещение и значение будут фактическим содержимым файла. Необходимо установить issplittable в false (мы не хотим разделить файл). установите maxsplitsize на значение вашего требования. на основе этого значения Combinefilerecordreader решает количество разделов и создает экземпляр для каждого разделения. Вы должны создать свой собственный инструмент чтения записей, добавив к нему свою логику декомпрессии.

Пользовательские RecordReader:

Пользовательские Recordreader использует linereader и устанавливает ключ как имя файла, смещение и значение, как фактическое содержание файла. Если файл сжат, он распаковывает его и считывает. Вот выдержка для этого.

private void codecWiseDecompress(Configuration conf) throws IOException{ 

     CompressionCodecFactory factory = new CompressionCodecFactory(conf); 
     CompressionCodec codec = factory.getCodec(path); 

      if (codec == null) { 
       System.err.println("No Codec Found For " + path); 
       System.exit(1); 
      } 

      String outputUri = 
CompressionCodecFactory.removeSuffix(path.toString(), 
codec.getDefaultExtension()); 
      dPath = new Path(outputUri); 

      InputStream in = null; 
      OutputStream out = null; 
      fs = this.path.getFileSystem(conf); 

      try { 
       in = codec.createInputStream(fs.open(path)); 
       out = fs.create(dPath); 
       IOUtils.copyBytes(in, out, conf); 
       } finally { 
        IOUtils.closeStream(in); 
        IOUtils.closeStream(out); 
        rlength = fs.getFileStatus(dPath).getLen(); 
       } 
     } 

Пользовательские Writable Класс:

Пара с именем файла, значение смещения

+0

@VigneshI Спасибо за ответ. Я уже рассмотрел этот вариант, и он не самый лучший, поскольку он может иметь побочный эффект от файлов, созданных на HDFS. Есть ли лучший способ сделать это, не распаковывая временные файлы. – user300313

+0

@ VigneshI У вас есть решение для этого без временных файлов? – refaelos

Смежные вопросы