2017-06-12 277 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)
相关问题