Java 在Amazon S3 bucket中创建Avro文件
如何在s3 bucket中创建一个Avro文件,然后将Avro记录附加到该文件中 我拥有字节数组形式的所有avro记录,并成功地在avro文件中传输。但他的文件(据我所知)不是一份完整的avro文件。因为完整的avro文件是模式+数据 下面是在S3中传输文件中字节记录的代码 任何人都知道如何创建基于avro模式的文件,然后将这些字节传输到同一个文件Java 在Amazon S3 bucket中创建Avro文件,java,file,amazon-web-services,amazon-s3,avro,Java,File,Amazon Web Services,Amazon S3,Avro,如何在s3 bucket中创建一个Avro文件,然后将Avro记录附加到该文件中 我拥有字节数组形式的所有avro记录,并成功地在avro文件中传输。但他的文件(据我所知)不是一份完整的avro文件。因为完整的avro文件是模式+数据 下面是在S3中传输文件中字节记录的代码 任何人都知道如何创建基于avro模式的文件,然后将这些字节传输到同一个文件 public void sendByteData(byte [] b, Schema schema){ try{
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();
}
}
public void sendByteData(字节[]b,模式){
试一试{
AWSCredentials凭证=新的基本凭证(“XXXXX”、“XXXXXX”);
AmazonS3 s3Client=新的AmazonS3客户端(凭据);
//createFolder(“encounterdatasample”、“avrofiles”、s3Client);
ObjectMetadata meta=新的ObjectMetadata();
meta.setContentLength(b.length);
InputStream=新的ByteArrayInputStream(b);
/*File File=新文件(“/home/abhishek/sample.avro”);
DatumWriter=新的GenericDatumWriter(模式);
DataFileWriter DataFileWriter=新的DataFileWriter(writer);
创建(模式,文件);
s3Client.putObject(“encounterdatasample”、dataFileWriter.create(模式、文件)、stream、meta);
*/
s3Client.putObject(“encounterdatasample”、“sample.avro”、stream、meta);
System.out.println(“完成数据写入”);
}捕获(例外e){
e、 printStackTrace();
}
}
注释中的代码不起作用。我只是想玩弄它。
有什么帮助吗
谢谢。我相信您的断言是正确的,您不能在字节数组中同时对数据和模式进行编码。您需要使用一些容器(通常是一个文件)来对两者进行编码 通过一些修复,您注释掉的代码应该可以工作。我只是在用Java编写的Lambda中做了类似的事情。我使用
DataFileWriter
将文件写入本地磁盘(/tmp
),然后使用您的语法将该文件放入S3,没有问题
两项建议:
- 完成对文件的写入后,调用
dataFileWriter.close()
- 在
调用中直接使用s3Client.putObject
对象,例如file
s3Client.putObject(bucket、key、file)