有一个用bzip2编解码器压缩的文件。
我解压缩文件并将值设置为InputStream
InputStream inputStream = codec.createInputStream(fs.open(file));
现在我必须将InputStream
转换为FSDataInputStream
。
请有人帮助我。
答案 0 :(得分:1)
我只提供一些实现selalerer给出的解决方案的代码。
正如selalerer所解释的那样,由于无法通过数据进行搜索而无法执行此操作,因此无法执行此操作,而FSDataInputStream需要这样做。 所以你必须创建一个输出流并在其中写入输入流的所有数据,然后用FSDataInputStream打开所述输出流是可行的。
这是代码。
(我假设您在RecordReader实现中执行此操作,其中您有一个压缩的FileSplit分割对象)
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);
}
希望这对某人有帮助。
答案 1 :(得分:0)
我不确定这是不可能的。 bzip2解码器可能在您读取文件时进行解码,并且不保存已经解码和读取的部分。这意味着无法来回搜索数据。
如果是解码器的情况,一个选项是读取所有数据,然后用FSInputStream包装它。
答案 2 :(得分: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));