如何在hadoop中将inputstream数据设置为fsdatainputstream

00jrzges  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(457)

有一个用bzip2编解码器压缩的文件。
我解压缩文件并将值设置为 InputStream ```
InputStream inputStream = codec.createInputStream(fs.open(file));

现在我必须转换 `InputStream` 至 `FSDataInputStream` .
有人能帮我吗。
deikduxw

deikduxw1#

我不确定这是否可能。bzip2解码器可能在您读取文件时进行解码,并且不保存已解码和读取的部分。这意味着没有办法在数据中来回寻找。
如果解码器是这种情况,一种选择是读取所有数据,然后用fsinputstream Package 它。

3phpmpom

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));
nhaq1z21

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);
      }

希望这对别人有帮助。

相关问题