2016-12-27 16 views
0

ファイルを既存のシーケンスファイルに追加する方法のサンプルコードスニペットを提供できますか?//ユーザ/ {に、HomeDirectory}:以下 既存のシーケンスファイルに追加

私は既存のシーケンスファイルOUTPUTFILEに追加するために使用されるコードであるが、シーケンスファイルを読みながら後にチェックサムエラー投げている追加:

問題開くチェックサムファイルをデスクトップ/サンプル/シーケンスファイル/出力ファイル。無視例外:java.io.EOFException

public class AppendSequenceFile { 

    /** 
    * @param args 
    * @throws IOException 
    * @throws IllegalAccessException 
    * @throws InstantiationException 
    */ 
    public static void main(String[] args) throws IOException, 
      InstantiationException, IllegalAccessException { 

     Configuration conf = new Configuration(); 

     FileSystem fs = FileSystem.get(conf); 
     Path inputFile = new Path("/Users/{homedirectory}/Desktop/Sample/SequenceFile/sampleAppendTextFiles"); 
     Path sequenceFile = new Path("/Users/{homedirectory}/Desktop/Sample/SequenceFile/outputfile"); 
     FSDataInputStream inputStream; 
     Text key = new Text(); 
     Text value = new Text(); 
     SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, 
       sequenceFile, key.getClass(), value.getClass()); 
     FileStatus[] fStatus = fs.listStatus(inputFile); 

     for (FileStatus fst : fStatus) { 
      String str = ""; 
      System.out.println("Processing file : " + fst.getPath().getName() + " and the size is : " + fst.getPath().getName().length()); 
      inputStream = fs.open(fst.getPath()); 
      key.set(fst.getPath().getName()); 
      while(inputStream.available()>0) { 
       str = str+inputStream.readLine(); 
      } 
      value.set(str); 
      writer.append(key, value); 

     } 
    } 
} 

シーケンスファイルリーダー:事前に

public class SequenceFileReader{ 
    public static void main(String[] args) throws Exception { 
     Configuration conf = new Configuration(); 
     FileSystem fs = FileSystem.get(conf); 
     Path path = new Path("/Users/{homedirectory}/Desktop/Sample/SequenceFile/outputfile"); 
     SequenceFile.Reader reader = null; 
     try { 
      reader = new SequenceFile.Reader(fs, path, conf); 
      Text key = new Text(); 
      Text value = new Text(); 
      while (reader.next(key, value)) { System.out.println(key); 
      System.out.println(value); 
      } 
     } finally { 
      IOUtils.closeStream(reader); 
     } 
    } 
} 

感謝。

+0

あなたのためにコードを書く人がいるようです。あなたはこの解決策を探すために何を試しましたか? –

+0

私はそれを追加しようとしましたが、追加した後にシーケンスファイルを読んでいるうちにチェックサムエラー以下になっていました - – user3400887

+0

チェックサムファイルを開いているときに問題が発生しました:/ Users/{homedirectory}/Desktop/Sample/SequenceFile/outputfile。無視される例外:java.io.EOFExceptionそれは私がここに質問を投稿した理由です。コードを使って質問を編集してみました。 – user3400887

答えて

1

私はこれをやっていませんが、Hadoop APIドキュメントを閲覧したところ、これが見つかりました。

このAPIを使用してライターを作成できます。 CreateFlagは、あなたが "APPEND" オプションを指定することができ、このAPIでSequenceFile

public static org.apache.hadoop.io.SequenceFile.Writer createWriter(FileContext fc,Configuration conf,Path name,Class keyClass,Class valClass,org.apache.hadoop.io.SequenceFile.CompressionType compressionType,CompressionCodec codec,org.apache.hadoop.io.SequenceFile.Metadata metadata,EnumSet<CreateFlag> createFlag,org.apache.hadoop.fs.Options.CreateOpts... opts) throws IOException

を参照してください。

+0

応答していただきありがとうございます。私はhadoop-core-0.20.2.jarを使用していますが、createFlag引数を渡すこの機能は存在しません。 – user3400887

+0

ええ、これは2.7バージョンで利用可能になったと思います。 – Amit

関連する問題