有一個使用bzip2編解碼器壓縮的文件。如何將InputStream數據設置爲hadoop中的FSDataInputStream
我解壓縮文件,然後將該值設置爲InputStream
InputStream inputStream = codec.createInputStream(fs.open(file));
現在我已經轉換到InputStream
FSDataInputStream
。
有人可以幫我。
有一個使用bzip2編解碼器壓縮的文件。如何將InputStream數據設置爲hadoop中的FSDataInputStream
我解壓縮文件,然後將該值設置爲InputStream
InputStream inputStream = codec.createInputStream(fs.open(file));
現在我已經轉換到InputStream
FSDataInputStream
。
有人可以幫我。
我不確定這是否可能。 bzip2解碼器在讀取文件時可能會進行解碼,並且不會保存已解碼和讀取的部分。這意味着無法通過數據來回查找。
如果解碼器出現這種情況,一種方法是讀取所有數據,然後用FSInputStream包裝它。
我只會提供一些代碼,實現由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);
}
希望這是別人的幫助。
您所需要的最低限度是:
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));
'新FSDataInputStream(的inputStream);'? :) – Messa