2017-06-12 266 views
2

如何在s3存儲桶中創建Avro文件,然後向其中添加avro記錄。在Amazon S3存儲桶中創建Avro文件

我有所有的字節數組形式的avro記錄,併成功地在一個avro文件中傳輸。但他的文件是(我知道)不是一個完整的avro文件。由於完整的avro文件是模式+數據。

以下是在S3中傳輸文件中字節記錄的代碼。

任何人都知道如何創建基於avro模式的文件,然後將這些字節傳輸到相同的文件。

public void sendByteData(byte [] b, Schema schema){ 
     try{ 
      AWSCredentials credentials = new BasicAWSCredentials("XXXXX", "XXXXXX"); 

      AmazonS3 s3Client = new AmazonS3Client(credentials); 

      //createFolder("encounterdatasample", "avrofiles", s3Client); 


      ObjectMetadata meta = new ObjectMetadata(); 
      meta.setContentLength(b.length); 
      InputStream stream = new ByteArrayInputStream(b); 

     /* File file = new File("/home/abhishek/sample.avro"); 
      DatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(schema); 
      DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(writer); 
      dataFileWriter.create(schema, file); 
      s3Client.putObject("encounterdatasample", dataFileWriter.create(schema, file), stream, meta); 
     */ 

      s3Client.putObject("encounterdatasample", "sample.avro", stream,meta); 
      System.out.println("Done writing the data"); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

註釋中的代碼不起作用。只是想玩弄它。 對此有任何幫助。

謝謝。

回答

0

我相信你的斷言是正確的,你不能在字節數組中編碼數據和模式。您需要使用某個容器(通常是文件)來對兩者進行編碼。

有一些修復,你已註釋掉的代碼應該工作。我只是在用Java編寫的Lambda中做了類似的事情。我使用DataFileWriter將文件寫入本地磁盤(/tmp),然後使用您的語法將該文件放到S3中,而沒有問題。

兩個建議:

  • 通話dataFileWriter.close()一旦你完成寫入文件。
  • 直接在s3Client.putObject調用中使用file對象,例如, s3Client.putObject(bucket,key,file)
相關問題