Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Amazon S3 bucket中创建Avro文件_Java_File_Amazon Web Services_Amazon S3_Avro - Fatal编程技术网

Java 在Amazon S3 bucket中创建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{

如何在s3 bucket中创建一个Avro文件,然后将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();
        }

    }
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)