如何在hadoop中将InputStream数据设置为FSDataInputStream

时间:2014-02-19 08:49:30

标签: java apache hadoop

有一个用bzip2编解码器压缩的文件。

我解压缩文件并将值设置为InputStream

InputStream inputStream = codec.createInputStream(fs.open(file));

现在我必须将InputStream转换为FSDataInputStream

请有人帮助我。

3 个答案:

答案 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));