2014-02-19 47 views

回答

0

我不確定這是否可能。 bzip2解碼器在讀取文件時可能會進行解碼,並且不會保存已解碼和讀取的部分。這意味着無法通過數據來回查找。

如果解碼器出現這種情況,一種方法是讀取所有數據,然後用FSInputStream包裝它。

1

我只會提供一些代碼,實現由selalerer給出的解決方案。

正如selalerer解釋的,這是不可能做到這一點,因爲你不能通過數據尋找和FSDataInputStream需要這樣做。 所以你必須創建一個輸出流並在其中寫入輸入流的所有數據,然後用FSDataInputStream打開所述輸出流。

這是代碼。

(IM假設你在你有被壓縮的對象FileSplit分裂一個RecordReader實現這樣做)

String uri=split.getPath().toUri().getPath(); 
InputStream in = null; 
OutputStream out = null; 
try{ 
      String outputUri = 
        CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension()); 
      in=codec.createInputStream(fsin); 
      out = fs.create(new Path(outputUri)); 
      IOUtils.copyBytes(in, out, conf); 

      fsin= fs.open(new Path(outputUri)); 
      end = Long.MAX_VALUE; 
     }finally{ 
      IOUtils.closeStream(in); 
      IOUtils.closeStream(out); 
     } 

希望這是別人的幫助。

0

您所需要的最低限度是:

FileSystem hdfs = FileSystem.get(new Configuration); 
String path = "file://" + myFilePath; // can include file extension 
URI uri = new URI(path); 
FSDataInputStream instrm = hdfs.open(new Path(uri)); 
相關問題