2016-03-23 3 views
3

XMLファイルを含むzipファイルをHDFSに保存しています。プログラムでファイルを解凍し、Javaを使用してXMLファイルをストリームアウトする必要があります。 FileSystem.openはFSDataInputStreamを返しますが、ZipFileコンストラクターはFileまたはStringのみをパラメーターとして取ります。私は本当にFileSystem.copyToLocalFileを使用する必要はありません。最初にローカルファイルシステムにコピーすることなく、Javaを使用してHDFSに保存されたファイルを解凍する方法は?

zipファイルをローカルファイルシステムに最初にコピーせずに、HDFSに保存されたzipファイルの内容をストリーミングすることはできますか?もしそうなら、どのように?

+0

方法をサンプルコードを見つけてください。 unzipコマンドをzipファイルの場所を入力として取り、>> yarn jar hadoop-streaming.jar -input -mapper のようなものを呼び出すスクリプトとしてラップします。 – urug

答えて

2

こんにちは、ここではHadoopのストリーミングを活用に関する

public static Map<String, byte[]> loadZipFileData(String hdfsFilePath) { 
      try { 
       ZipInputStream zipInputStream = readZipFileFromHDFS(new Path(hdfsFilePath)); 
       ZipEntry zipEntry = null; 
       byte[] buf = new byte[1024]; 
       Map<String, byte[]> listOfFiles = new LinkedHashMap<>(); 
       while ((zipEntry = zipInputStream.getNextEntry()) != null) { 
        int bytesRead = 0; 
        String entryName = zipEntry.getName(); 
        if (!zipEntry.isDirectory()) { 
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
         while ((bytesRead = zipInputStream.read(buf, 0, 1024)) > -1) { 
          outputStream.write(buf, 0, bytesRead); 
         } 
         listOfFiles.put(entryName, outputStream.toByteArray()); 
         outputStream.close(); 
        } 
        zipInputStream.closeEntry(); 
       } 
       zipInputStream.close(); 
       return listOfFiles; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 



protected ZipInputStream readZipFileFromHDFS(FileSystem fileSystem, Path path) throws Exception { 
    if (!fileSystem.exists(path)) { 
     throw new IllegalArgumentException(path.getName() + " does not exist"); 
    } 
    FSDataInputStream fsInputStream = fileSystem.open(path); 
    ZipInputStream zipInputStream = new ZipInputStream(fsInputStream); 
    return zipInputStream; 
} 
関連する問題