在Amazon S3存储桶中创建Avro文件
问题描述:
如何在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();
}
}
注释中的代码不起作用。只是想玩弄它。 对此有任何帮助。
谢谢。
答
我相信你的断言是正确的,你不能在字节数组中编码数据和模式。您需要使用某个容器(通常是文件)来对两者进行编码。
有一些修复,你已注释掉的代码应该工作。我只是在用Java编写的Lambda中做了类似的事情。我使用DataFileWriter
将文件写入本地磁盘(/tmp
),然后使用您的语法将该文件放到S3中,而没有问题。
两个建议:
- 通话
dataFileWriter.close()
一旦你完成写入文件。 - 直接在
s3Client.putObject
调用中使用file
对象,例如,s3Client.putObject(bucket,key,file)