有一个用bzip2编解码器压缩的文件。我解压缩文件并将值设置为 InputStream ```InputStream inputStream = codec.createInputStream(fs.open(file));
InputStream
现在我必须转换 `InputStream` 至 `FSDataInputStream` . 有人能帮我吗。
deikduxw1#
我不确定这是否可能。bzip2解码器可能在您读取文件时进行解码,并且不保存已解码和读取的部分。这意味着没有办法在数据中来回寻找。如果解码器是这种情况,一种选择是读取所有数据,然后用fsinputstream Package 它。
3phpmpom2#
您需要的最低要求是:
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));
nhaq1z213#
我只提供一些代码来实现selalerer给出的解决方案。正如selalerer所解释的,这样做是不可能的,因为您无法通过数据进行搜索,而fsdatainputstream需要这样做。因此,您必须创建一个outputstream并在其中写入输入流的所有数据,然后可以使用fsdatainputstream打开所述outputstream。这是密码。(我假设您在recordreader实现中执行此操作,其中有一个对象filesplit split,它是压缩的)
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); }
希望这对别人有帮助。
3条答案
按热度按时间deikduxw1#
我不确定这是否可能。bzip2解码器可能在您读取文件时进行解码,并且不保存已解码和读取的部分。这意味着没有办法在数据中来回寻找。
如果解码器是这种情况,一种选择是读取所有数据,然后用fsinputstream Package 它。
3phpmpom2#
您需要的最低要求是:
nhaq1z213#
我只提供一些代码来实现selalerer给出的解决方案。
正如selalerer所解释的,这样做是不可能的,因为您无法通过数据进行搜索,而fsdatainputstream需要这样做。因此,您必须创建一个outputstream并在其中写入输入流的所有数据,然后可以使用fsdatainputstream打开所述outputstream。
这是密码。
(我假设您在recordreader实现中执行此操作,其中有一个对象filesplit split,它是压缩的)
希望这对别人有帮助。